
每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类:
用户程序所在的容器,数量可多可少
Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:
可以以它为依据,评估整个Pod的健康状态
可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现Pod内部的网路通信
这里是Pod内部的通讯,Pod的之间的通讯采用虚拟二层网络技术来实现,我们当前环境用的是Flannel 下面是Pod的资源清单:
- apiVersion: v1 #必选,版本号,例如v1
- kind: Pod #必选,资源类型,例如 Pod
- metadata: #必选,元数据
- name: string #必选,Pod名称
- namespace: string #Pod所属的命名空间,默认为"default"
- labels: #自定义标签列表
- - name: string
- spec: #必选,Pod中容器的详细定义
- containers: #必选,Pod中容器列表
- - name: string #必选,容器名称
- image: string #必选,容器的镜像名称
- imagePullPolicy: [ Always|Never|IfNotPresent ] #获取镜像的策略
- command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
- args: [string] #容器的启动命令参数列表
- workingDir: string #容器的工作目录
- volumeMounts: #挂载到容器内部的存储卷配置
- - name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
- mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
- readOnly: boolean #是否为只读模式
- ports: #需要暴露的端口库号列表
- - name: string #端口的名称
- containerPort: int #容器需要监听的端口号
- hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
- protocol: string #端口协议,支持TCP和UDP,默认TCP
- env: #容器运行前需设置的环境变量列表
- - name: string #环境变量名称
- value: string #环境变量的值
- resources: #资源限制和请求的设置
- limits: #资源限制的设置
- cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
- memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
- requests: #资源请求的设置
- cpu: string #Cpu请求,容器启动的初始可用数量
- memory: string #内存请求,容器启动的初始可用数量
- lifecycle: #生命周期钩子
- postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
- preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
- livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
- exec: #对Pod容器内检查方式设置为exec方式
- command: [string] #exec方式需要制定的命令或脚本
- httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
- path: string
- port: number
- host: string
- scheme: string
- HttpHeaders:
- - name: string
- value: string
- tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
- port: number
- initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
- timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
- periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
- successThreshold: 0
- failureThreshold: 0
- securityContext:
- privileged: false
- restartPolicy: [Always | Never | OnFailure] #Pod的重启策略
- nodeName:
#设置NodeName表示将该Pod调度到指定到名称的node节点上 - nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
- imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- - name: string
- hostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
- volumes: #在该pod上定义共享存储卷列表
- - name: string #共享存储卷名称 (volumes类型有很多种)
- emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
- hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
- path: string #Pod所在宿主机的目录,将被用于同期中mount的目录
- secret: #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
- scretname: string
- items:
- - key: string
- path: string
- configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
- name: string
- items:
- - key: string
- path: string
- #小提示:
- # 在这里,可通过一个命令来查看每种资源的可配置项
- # kubectl explain 资源类型 查看某种资源可以配置的一级属性
- # kubectl explain 资源类型.属性 查看属性的子属性
- [root@k8s-master01 ~]# kubectl explain pod
- KIND: Pod
- VERSION: v1
- FIELDS:
- apiVersion <string>
- kind <string>
- metadata <Object>
- spec <Object>
- status <Object>
-
- [root@k8s-master01 ~]# kubectl explain pod.metadata
- KIND: Pod
- VERSION: v1
- RESOURCE: metadata <Object>
- FIELDS:
- annotations <map[string]string>
- clusterName <string>
- creationTimestamp <string>
- deletionGracePeriodSeconds <integer>
- deletionTimestamp <string>
- finalizers <[]string>
- generateName <string>
- generation <integer>
- labels <map[string]string>
- managedFields <[]Object>
- name <string>
- namespace <string>
- ownerReferences <[]Object>
- resourceVersion <string>
- selfLink <string>
- uid <string>
在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。
命令操作
- # 命令格式: kubectl create deployment 名称 [参数]
- # --image 指定pod的镜像
- # --port 指定端口
- # --replicas 指定创建pod数量
- # --namespace 指定namespace
-
-
- [root@master ~]# kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n dev
- deployment.apps/nginx created
-
- # 查看创建的Pod
- [root@master ~]# kubectl get pods -n dev
- NAME READY STATUS RESTARTS AGE
- nginx-cd55c47f5-9fkp5 1/1 Running 0 2m23s
- nginx-cd55c47f5-lz82t 1/1 Running 0 2m23s
- nginx-cd55c47f5-ssrpd 1/1 Running 0 2m23s
- nginxpod 1/1 Running 1 (79m ago) 24h
-
-
- 查看deployment的信息
- [root@master ~]# kubectl get deploy -n dev
- NAME READY UP-TO-DATE AVAILABLE AGE
- nginx 3/3 3 3 2m50s
-
-
- # UP-TO-DATE:成功升级的副本数量
- # AVAILABLE:可用副本的数量
- [root@master ~]# kubectl get deploy -n dev -o wide
- NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
- nginx 3/3 3 3 3m15s nginx nginx:latest app=nginx
-
-
- # 查看deployment的详细信息
- [root@master ~]# kubectl get deploy -n dev
- NAME READY UP-TO-DATE AVAILABLE AGE
- nginx 3/3 3 3 2m50s
- [root@master ~]# kubectl get deploy -n dev -o wide
- NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
- nginx 3/3 3 3 3m15s nginx nginx:latest app=nginx
- [root@master ~]# kubectl describe deploy nginx -n dev
- Name: nginx
- Namespace: dev
- CreationTimestamp: Fri, 09 Sep 2022 11:35:19 +0800
- Labels: app=nginx
- Annotations: deployment.kubernetes.io/revision: 1
- Selector: app=nginx
- Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
- StrategyType: RollingUpdate
- MinReadySeconds: 0
- RollingUpdateStrategy: 25% max unavailable, 25% max surge
- Pod Template:
- Labels: app=nginx
- Containers:
- nginx:
- Image: nginx:latest
- Port: 80/TCP
- Host Port: 0/TCP
- Environment: <none>
- Mounts: <none>
- Volumes: <none>
- Conditions:
- Type Status Reason
- ---- ------ ------
- Available True MinimumReplicasAvailable
- Progressing True NewReplicaSetAvailable
- OldReplicaSets: <none>
- NewReplicaSet: nginx-cd55c47f5 (3/3 replicas created)
- Events:
- Type Reason Age From Message
- ---- ------ ---- ---- -------
- Normal ScalingReplicaSet 3m41s deployment-controller Scaled up replica set nginx-cd55c47f5 to
-
- //删除
- [root@master ~]# kubectl delete deploy nginx -n dev
- deployment.apps "nginx" deleted
- [root@master ~]# vim deploy-nginx.yaml
-
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: nginx
- namespace: dev
- spec:
- replicas: 3
- selector:
- matchLabels:
- run: nginx
- template:
- metadata:
- labels:
- run: nginx
- spec:
- containers:
- - image: nginx:latest
- name: nginx
- ports:
- - containerPort: 80
- protocol: TCP
- //配置操作
-
- [root@master ~]# kubectl create -f deploy-nginx.yaml
- deployment.apps/nginx created
- //创建
通过上节课的学习,已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。
虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:
这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。
Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
- # 暴露Service
- [root@master ~]# kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
- service/svc-nginx1 exposed
-
- [root@master ~]# kubectl get svc svc-nginx1 -n dev -o wide
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
- svc-nginx1 ClusterIP 10.108.2.17 <none> 80/TCP 18s run=nginx
- //查看service
-
- # 这里产生了一个CLUSTER-IP,这就是service的IP,在Service的生命周期中,这个地址是不会变动的
- # 可以通过这个IP访问当前service对应的POD
-
- [root@master ~]# curl 10.108.2.17:80
- <!DOCTYPE html>
- <html>
- <head>
- <title>Welcome to nginx!</title>
- <style>
- html { color-scheme: light dark; }
- body { width: 35em; margin: 0 auto;
- font-family: Tahoma, Verdana, Arial, sans-serif; }
- </style>
- </head>
- <body>
- <h1>Welcome to nginx!</h1>
- <p>If you see this page, the nginx web server is successfully installed and
- working. Further configuration is required.</p>
-
- <p>For online documentation and support please refer to
- <a href="http://nginx.org/">nginx.org</a>.<br/>
- Commercial support is available at
- <a href="http://nginx.com/">nginx.com</a>.</p>
-
- <p><em>Thank you for using nginx.</em></p>
- </body>
- </html>
- //master访问,在node1 node2上也可以访问
-
- [root@node1 ~]# curl 10.108.2.17:80
- <!DOCTYPE html>
- <html>
- <head>
- <title>Welcome to nginx!</title>
- <style>
- html { color-scheme: light dark; }
- body { width: 35em; margin: 0 auto;
- font-family: Tahoma, Verdana, Arial, sans-serif; }
- </style>
- </head>
- <body>
- <h1>Welcome to nginx!</h1>
- <p>If you see this page, the nginx web server is successfully installed and
- working. Further configuration is required.</p>
-
- <p>For online documentation and support please refer to
- <a href="http://nginx.org/">nginx.org</a>.<br/>
- Commercial support is available at
- <a href="http://nginx.com/">nginx.com</a>.</p>
-
- <p><em>Thank you for using nginx.</em></p>
- </body>
- </html>
-
- [root@node2 ~]# curl 10.108.2.17:80
- <!DOCTYPE html>
- <html>
- <head>
- <title>Welcome to nginx!</title>
- <style>
- html { color-scheme: light dark; }
- body { width: 35em; margin: 0 auto;
- font-family: Tahoma, Verdana, Arial, sans-serif; }
- </style>
- </head>
- <body>
- <h1>Welcome to nginx!</h1>
- <p>If you see this page, the nginx web server is successfully installed and
- working. Further configuration is required.</p>
-
- <p>For online documentation and support please refer to
- <a href="http://nginx.org/">nginx.org</a>.<br/>
- Commercial support is available at
- <a href="http://nginx.com/">nginx.com</a>.</p>
-
- <p><em>Thank you for using nginx.</em></p>
- </body>
- </html>
-
创建集群外部也可访问的Service
可以作为负载均衡
- # 如果需要创建外部也可以访问的Service,需要修改type为NodePort
- [root@master ~]# kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
- service/svc-nginx2 exposed
-
- #此时查看,会发现出现了NodePort类型的Service,而且有一对Port(80:31928/TC)
- [root@master ~]# kubectl get svc svc-nginx2 -n dev -o wide
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
- svc-nginx2 NodePort 10.98.158.216 <none> 80:32316/TCP 38s run=nginx
-
- # 接下来就可以通过集群外的主机访问 节点IP:31928访问服务了
- # 例如在的电脑主机上通过浏览器访问下面的地址
-
-
- //如要删除的话
- [root@master ~]# kubectl delete svc svc-nginx-1 -n dev
- service "svc-nginx-1" deleted

master访问

node1访问

node2访问
配置方式
创建一个svc-nginx.yaml,内容如下:
- [root@master ~]# vi nginx.yaml
-
- apiVersion: v1
- kind: Service
- metadata:
- name: svc-nginx
- namespace: dev
- spec:
- clusterIP: 10.109.179.231
- ports:
- - port: 80
- protocol: TCP
- targetPort: 80
- selector:
- run: nginx
- type: ClusterIP
-
-
- //创建
- [root@master ~]# kubectl create -f nginx.yaml
- service/svc-nginx created
-
- [root@master ~]# kubectl get svc nginx
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- nginx NodePort 10.103.112.159 <none> 80:31150/TCP 47h