编程语言
9005
Kubernetes的核心对象
Pod资源对象
Controller
Service
命令式容器应用编排
部署应用Pod
1)创建Deployment控制器对象
# 创建一个名字叫做nginx的deployment控制器,并指定pod镜像使用nginx:1.12版本,并暴露容器内的80端口,并指定副本数量为1个,并先通过--dry-run测试命令是否错误。 [root@k8s-master ~]# kubectl run nginx --image=nginx:1.12 --port=80 --replicas=1 --dry-run=true [root@k8s-master ~]# kubectl run nginx --image=nginx:1.12 --port=80 --replicas=1 deployment.apps/nginx created [root@k8s-master ~]# kubectl get pods #查看所有pod对象 NAME READY STATUS RESTARTS AGE nginx-685cc95cd4-9z4f4 1/1 Running 0 89s ###参数说明: --image 指定需要使用到的镜像。 --port 指定容器需要暴露的端口。 --replicas 指定目标控制器对象要自动创建Pod对象的副本数量。
2)打印资源对象的相关信息
[root@k8s-master ~]# kubectl get deployment #查看所有deployment控制器对象 NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 66s ###字段说明: NAME 资源对象名称 READY 期望由当前控制器管理的Pod对象副本数及当前已有的Pod对象副本数 UP-TO-DATE 更新到最新版本定义的Pod对象的副本数量,在控制器的滚动更新模式下,表示已经完成版本更新的Pod对象的副本数量 AVAILABLE 当前处于可用状态的Pod对象的副本数量,即可正常提供服务的副本数。 AGE Pod的存在时长 说明:Deployment资源对象通过ReplicaSet控制器实例完成对Pod对象的控制,而非直接控制。另外,通过控制器创建的Pod对象都会被自动附加一个标签。格式为“run=<Controller_Name>”。 [root@k8s-master ~]# kubectl get deployment -o wide #查看deployment控制器对象的详细信息 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx 1/1 1 1 69m nginx nginx:1.12 run=nginx [root@k8s-master ~]# kubectl get pods #查看pod资源 NAME READY STATUS RESTARTS AGE nginx-685cc95cd4-9z4f4 1/1 Running 0 72m [root@k8s-master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-685cc95cd4-9z4f4 1/1 Running 0 73m 10.244.1.12 k8s-node1 <none> <none> ###字段说明: NAME pode资源对象名称 READY pod中容器进程初始化完成并能够正常提供服务时即为就绪状态,此字段用于记录处于就绪状态的容器数量 STATUS pod的当前状态,其值有Pending、Running、Succeeded、Failed和Unknown等其中之一 RESTARTS Pod重启的次数 IP pod的IP地址,通常由网络插件自动分配 NODE pod被分配的节点。
3)访问Pod对象
[root@k8s-master ~]# kubectl get pods -o wide #查看pod详细信息 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-685cc95cd4-9z4f4 1/1 Running 0 88m 10.244.1.12 k8s-node1 <none> <none> [root@k8s-master ~]# curl 10.244.1.12 #kubernetes集群的master节点上访问 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> 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@k8s-node2 ~]# curl 10.244.1.12 #kubernetes集群的node节点上访问 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> 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>
上面访问是基于一个pod的情况下,但是,当这个pod由于某种原因意外挂掉了,或者所在的节点挂掉了,那么deployment控制器会立即创建一个新的pod,这时候再去访问这个IP就访问不到了,而我们不可能每次去到节点上看到IP再进行访问。测试如下:
[root@k8s-master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-685cc95cd4-9z4f4 1/1 Running 0 99m 10.244.1.12 k8s-node1 <none> <none> [root@k8s-master ~]# kubectl delete pods nginx-685cc95cd4-9z4f4 #删除上面的pod pod "nginx-685cc95cd4-9z4f4" deleted [root@k8s-master ~]# kubectl get pods -o wide #可以看出,当上面pod刚删除,接着deployment控制器又马上创建了一个新的pod,且这次分配在k8s-node2节点上了。 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-685cc95cd4-z5z9p 1/1 Running 0 89s 10.244.2.14 k8s-node2 <none> <none> [root@k8s-master ~]# curl 10.244.1.12 #访问之前的pod,可以看到已经不能访问 curl: (7) Failed connect to 10.244.1.12:80; 没有到主机的路由 [root@k8s-master ~]# [root@k8s-master ~]# curl 10.244.2.14 #访问新的pod,可以正常访问 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> 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对象
1)创建Service对象(将Service端口代理至Pod端口示例)
#方法一 [root@k8s-master ~]# kubectl expose deployment nginx --name=nginx-svc --port=80 --target-port=80 --protocol=TCP #为deployment的nginx创建service,取名叫nginx-svc,并通过service的80端口转发至容器的80端口上。 service/nginx-svc exposed #方法二 [root@k8s-master ~]# kubectl expose deployment/nginx --name=nginx-svc --port=80 --target-port=80 --protocol=TCP service/nginx-svc exposed ###参数说明: --name 指定service对象的名称 --port 指定service对象的端口 --target-port 指定pod对象容器的端口 --protocol 指定协议 [root@k8s-master ~]# kubectl get svc #查看service对象。或者kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 25h nginx-svc ClusterIP 10.109.54.136 <none> 80/TCP 41s
这时候可以在kubernetes集群上所有节点上直接访问nginx-svc的cluster-ip及可访问到名为deployment控制器下nginx的pod。并且,集群中的别的新建的pod都可以直接访问这个IP或者这个service名称即可访问到名为deployment控制器下nginx的pod。示例:
# master节点上通过ServiceIP进行访问 [root@k8s-master ~]# curl 10.109.54.136 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> 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> #新建一个客户端pod进行访问,这里这个客户端使用busybox镜像,且pod副本数量为1个,-it表示进入终端模式。--restart=Never,表示从不重启。 [root@k8s-master ~]# kubectl run client --image=busybox --replicas=1 -it --restart=Never If you don't see a command prompt, try pressing enter. / # wget -O - -q 10.109.54.136 #访问上面创建的(service)nginx-svc的IP <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...... / # / # wget -O - -q nginx-svc #访问上面创建的(service)名称nginx-svc <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
2)创建Service对象(将创建的Pod对象使用“NodePort”类型的服务暴露到集群外部)
[root@k8s-master ~]# kubectl run mynginx --image=nginx:1.12 --port=80 --replicas=2 #创建一个deployments控制器并使用nginx镜像作为容器运行的应用。 [root@k8s-master ~]# kubectl get pods #查看创建的pod NAME READY STATUS RESTARTS AGE client 1/1 Running 0 15h mynginx-68676f64-28fm7 1/1 Running 0 24s mynginx-68676f64-9q8dj 1/1 Running 0 24s nginx-685cc95cd4-z5z9p 1/1 Running 0 16h [root@k8s-master ~]# [root@k8s-master ~]# kubectl expose deployments/mynginx --type="NodePort" --port=80 --name=mynginx-svc #创建一个service对象,并将mynginx创建的pod对象使用NodePort类型暴露到集群外部。 service/mynginx-svc exposed [root@k8s-master ~]# [root@k8s-master ~]# kubectl get svc #查看service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 41h mynginx-svc NodePort 10.111.89.58 <none> 80:30884/TCP 10s nginx-svc ClusterIP 10.109.54.136 <none> 80/TCP 15h ###字段说明: PORT(S) 这里的mynginx-svc对象可以看出,集群中各工作节点会捕获发往本地的目标端口为30884的流量,并将其代理至当前service对象的80端口。于是集群外部的用户可以使用当前集群中任一节点的此端口来请求Service对象上的服务。 [root@k8s-master ~]# [root@k8s-master ~]# netstat -nlutp |grep 30884 #查看master节点上是否有监听上面的30884端口 tcp6 0 0 :::30884 :::* LISTEN 7340/kube-proxy [root@k8s-node1 ~]# [root@k8s-node1 ~]# netstat -nlutp |grep 30884 #查看node节点是否有监听上面的30884端口 tcp6 0 0 :::30884 :::* LISTEN 2537/kube-proxy
客户端访问kubernetes集群的30884端口
3)Service资源对象的描述
[root@k8s-master ~]# kubectl describe service mynginx-svc Name: mynginx-svc Namespace: default Labels: run=mynginx Annotations: <none> Selector: run=mynginx Type: NodePort IP: 10.111.89.58 Port: <unset> 80/TCP TargetPort: 80/TCP NodePort: <unset> 30884/TCP Endpoints: 10.244.1.14:80,10.244.2.15:80 Session Affinity: None External Traffic Policy: Cluster Events: <none> ###字段说明: Selector 当前Service对象使用的标签选择器,用于选择关联的Pod对象 Type 即Service的类型,其值可以是ClusterIP、NodePort和LoadBalancer等其中之一 IP 当前Service对象的ClusterIP Port 暴露的端口,即当前Service用于接收并响应的端口 TargetPort 容器中的用于暴露的目标端口,由Service Port路由请求至此端口 NodePort 当前Service的NodePort,它是否存在有效值与Type字段中的类型相关 Endpoints 后端端点,即被当前Service的Selector挑中的所有Pod的IP及其端口 Session Affinity 是否启用会话粘性 External Traffic Policy 外部流量的调度策略
扩容和缩容
上面示例中创建的Deployment对象nginx仅创建了一个Pod对象,其所能够承载的访问请求数量即受限于这单个Pod对象的服务容量。请求流量上升到接近或超出其容量之前,可以通过kubernetes的“扩容机制”来扩招Pod的副本数量,从而提升其服务容量。
扩容示例
[root@k8s-master ~]# kubectl get pods -l run=nginx #查看标签run=nginx的pod NAME READY STATUS RESTARTS AGE nginx-685cc95cd4-z5z9p 1/1 Running 0 17h [root@k8s-master ~]# [root@k8s-master ~]# kubectl scale deployments/nginx --replicas=3 #将其扩容到3个 deployment.extensions/nginx scaled [root@k8s-master ~]# [root@k8s-master ~]# kubectl get pods -l run=nginx #再次查看 NAME READY STATUS RESTARTS AGE nginx-685cc95cd4-f2cwb 1/1 Running 0 5s nginx-685cc95cd4-pz9dk 1/1 Running 0 5s nginx-685cc95cd4-z5z9p 1/1 Running 0 17h [root@k8s-master ~]# [root@k8s-master ~]# kubectl describe deployments/nginx #查看Deployment对象nginx详细信息 Name: nginx Namespace: default CreationTimestamp: Thu, 29 Aug 2019 15:29:31 +0800 Labels: run=nginx Annotations: deployment.kubernetes.io/revision: 1 Selector: run=nginx Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate ... #由nginx自动创建的pod资源全部拥有同一个标签选择器“run=nginx”,因此,前面创建的Service资源对象nginx-svc的后端端点也已经通过标签选择器自动扩展到了这3个Pod对象相关的端点 [root@k8s-master ~]# kubectl describe service/nginx-svc Name: nginx-svc Namespace: default Labels: run=nginx Annotations: <none> Selector: run=nginx Type: ClusterIP IP: 10.109.54.136 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 10.244.1.15:80,10.244.2.14:80,10.244.2.16:80 Session Affinity: None Events: <none>
缩容示例
[root@k8s-master ~]# kubectl scale deployments/nginx --replicas=2 deployment.extensions/nginx scaled [root@k8s-master ~]# [root@k8s-master ~]# kubectl get pods -l run=nginx NAME READY STATUS RESTARTS AGE nginx-685cc95cd4-pz9dk 1/1 Running 0 10m nginx-685cc95cd4-z5z9p 1/1 Running 0 17h
删除对象
[root@k8s-master ~]# kubectl get services #查看当前所有的service对象 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 43h mynginx-svc NodePort 10.111.89.58 <none> 80:30884/TCP 96m nginx-svc ClusterIP 10.109.54.136 <none> 80/TCP 17h [root@k8s-master ~]# kubectl delete service nginx-svc #删除service对象nginx-svc
[root@k8s-master ~]# kubectl delete deployment --all deployment.extensions "mynginx" deleted
注意:受控于控制器的Pod对象在删除后会被重建,删除此类对象需要直接删除其控制器对象。不过,删除控制器时若不想删除其Pod对象,可在删除命令上使用“--cascade=false“选项。