【K8S学习二】在新建的kubernetes上创建pod,deployment和服务(测试案例)

一、导语

根据上一篇学习文章,我们已经得到了一个kubernetes集群,那么要如何将应用部署在这个集群上并对外提供服务呢?kubernetes又如何才能做到应用高可用呢?下面将主要通过部署一个nginx作为案例来进行学习

二、概念

首先需要大致了解几个专用名词,分别是:
1.master
2.node
3.pod
4.Replication Controller(RC)
5.Replica Sets(RS)
6.deployment
7.svc
8.namespace

1.master

master是kubernetes的主要控制节点,也是kubernetes的核心,主要用于控制和监控整个k8s的运行。当master出现异常或不可使用的时候,则整个kubernetes集群不可使用。它主要由etcd、api-server、scheduler、control-manager几个部分组成,其中:

etcd:
保存了kubernetes集群所有的对象、当前状态、访问信息、集群配置信息等;
api-server:
集群操作接口,kubernetes是通过api-server暴露出对集群的操作的端点,master和worker上的组件都需要访问api server,从而完成自己的工作;
scheduler:
调度程序,它负责了调配整个集群工作,告诉集群中什么工作应该由哪个机器干;
control-manager:
监视集群的状态(通过调用api server获取该数据),并采取相应的措施将集群置于预期状态。

2.node

node是k8s中的workder节点,大致可以认为是由kubelet、kube-proxy、pod三个部分组成,其中:

kubelet,负责了整个容器的生命周期管理。它与master的api server沟通,运行调度到本节点的容器;
kube-proxy,使用ip表/ipvs处理pod的网络需求。实线集群内的服务发现和负载均衡;
pod,是k8s中的最小单元,是一个容器或者多个容器的集合,它提供了容器间联网的能力;

3.pod

pod是k8s的最小单元,一个pod中可以有多个容器,这些容器中的应用互相间都视为本地。pod的网络接口提供了一个机制,使其可以与本节点或其他节点上的pod进行网络连接。

上面三个概念,可以认为是物理概念,是组成k8s集群最基本的几个组建,下面几个概念,则主要是支持kubernetes正常运行的资源对象,pod的创建、高可用副本、服务提供则是主要靠资源对象实现。

4.Replication Controller(RC)

副本控制器,主要用于保证kubernetes中pod的高可用,可以指定pod运行的数量,当集群中的服务pod出现异常或者被删除,则由它保证拉去或者启动新的pod。

5.Replica Sets(RS)

可以看作是rc的升级,能支持更多种类的匹配模式。

6.Deployment

Deployment可以认为是一种对pod、其副本集、服务的管理方式。我们可以通过Deployment来定义需要创建的pod以及pod的数量(RS)。Deployment也可以被用来创建服务,更新服务,滚动升级服务等。

7.svc

svc即服务(service),由于pod可以认为是无状态的,在新建、删除重新拉去后,会产生新的ip,甚至在新的节点上运行,所以我们无法获取固定的ip和端口号,业务则不能直接用pod进行服务调用。但是kubernetes引入了服务svc的概念,svc对内将会给Pod提供一个入口,主要通过seletor选择Labels标签连接后端Pod,这时候不论后端Pod的IP地址是否改变,我们只需要保证pod的标签没变即可。对外则可以将pod提供服务的端口进行映射,我们直接通过访问node的ip+映射端口即可访问服务。

8.namespace

namespace主要用于资源隔离,默认情况下我们创建的所有pod会在default的namespace中,所有pod相互可见,可以相互通信。但是当pod属于不同的项目或者不想让pod之间进行互相访问时,我们则可以通过定义namespace来实现。

9.ingress

ingress类似于网关,也可以理解为物理的f5,主要实现了kubernetes的南北流量的路由和转发,由于我们通过svc进行服务访问的时候,只能通过node ip+端口的方式进行,假设我们有10个副本,那么业务访问只能通过10个node的ip来访问,这也为实际的业务应用造成了极大的不方便。为了让pod与外界有一个最直接唯一的出口,我们则可以通过loadbalance service(一般是云服务厂商提供的域名等),或者ingress实现。

在kubernetes中还有很多其他的资源对象,比如volume,pv,pvc等,由于在本实例中暂未使用,因此暂不描述。

二、案例

在实际实验案例中,我们则可以直接通过k8s来部署,部署nginx,并进行访问验证:
1.创建namespace

kubectl create namespace wxtest

2.查看namespace资源对象

kubectl get namespace

3.单独部署pod

[root@master yaml]# cat nginx-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod		##pod名称
  labels:
    app: nginx    ###写上这个pod的标签,方便svc连接
  namespace: wxtest
spec:
  containers:
  - name: nginx-pod	##pod容器名称
    image: 172.16.131.87:1088/kubernets-deploy/nginx:latest		###镜像
    imagePullPolicy: IfNotPresent			###镜像拉取策略
    ports:
    - containerPort: 80			###容器端口

4.通过yaml创建

kubectl apply -f nginx-pod.yaml

5.通过deployment部署pod以及副本集

cat nginx-deployment.yaml

apiVersion: nginx/v1
kind: Deployment
metadata:
  name: nginx
  namespace: wxtest
spec:
  replicas: 3
  strategy:
    rollingUpdate:  
      maxSurge: 1      #滚动升级时最大同时升级1个pod
      maxUnavailable: 1 #滚动升级时最大允许不可用的pod个数
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-pod
        image: 172.16.131.87:1088/kubernets-deploy/nginx:latest
        imagePullPolicy: NEVER
        imagePullPolicy: Always
        ports:
        - containerPort: 80

6.通过yaml创建

kubectl create -f nginx-deployment.yaml

7.映射服务:

[root@master yaml]# cat nginx-svc.yaml 

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx			###关联容器标签
  ports:
  - protocol: TCP
    port: 80			###容器端口
    nodePort: 30080		 ###nodeport映射为30080端口,便于外部主机访问
  type: NodePort		 ###svc类型为nodeport

8.通过yaml创建服务

kubectl apply -f nginx-svc.yaml

查看创建的资源对象:

kubectl get pod,deployment,svc -n wxtest

此时,我们则可以通过node节点直接进行访问了:

http://172.16.131.84:30080
http://172.16.131.85:30080
http://172.16.131.86:30080

猜你喜欢

转载自blog.csdn.net/wx370092877/article/details/130060724