Pod是可以创建和管理Kubernetes计算的最小可部署单元。一个Pod代表着集群中运行的一个进程。每个pod都有一个唯一的ip。
一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace
Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。典型的应用场景包括:
kubectl run -h 查看run命令的用法
master01 # kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --record
控制器名称 容器镜像 容器的端口 pod的数量 在Deployment revision中可以查看到执行的历史命令
查看
[master01 ]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deploy-55d8d67cf-kckf9 1/1 Running 0 2m55s 10.244.1.3 node01 <none> <none>
可以看到pod已经运行在一个工作节点上, 这里的ip是cni0桥的ip
[node01] # ifconfig cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 inet 10.244.1.1 netmask 255.255.255.0 broadcast 0.0.0.0
在集群内部任意的节点可以访问pod。集群外部无法直接访问pod
删除pods 查看会看到自动起来另一个,因为 replicas个数为1
# kubectl delete pod nginx-deploy-55d8d67cf-kckf9 pod "nginx-deploy-55d8d67cf-kckf9" deleted # kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deploy-55d8d67cf-lf5xb 1/1 Running 0 2m55s 10.244.1.3 node01 <none> <none>
举个例子:a服务运行3个pod,b服务怎么访问a服务的pod,pod的ip都不是持久化的重启之后就会有变化。
这时候b服务可以访问跟a服务绑定的service,service信息是固定的提前告诉b就行了,service通过Label Selector跟a服务的pod绑定,无论a的pod如何变化对b来说都是透明的。
kubectl expose -h 查看命令的用法
# kubectl expose deployment nginx-deploy --name=nginx80 --port=80 --target-port=80 --protocol=TCP
service_name service_port pod_port service/nginx exposed
查看service
# kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26d <none> nginx80 ClusterIP 10.105.125.134 <none> 80/TCP 118s run=nginx-deploy
pod客户端访问可以使用 service_name:service_port 访问pod。 说明service可以为pod提供固定访问端点。
# kubectl run client --image=busybox --replicas=1 -it --restart=Never
\# wget -O - -q http://nginx:80 可以访问到pod
kubectl describe svc nginx 查看service详细信息
实践:
创建两个pod
# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
# kubectl get pods -o wide
创建一个service
# kubectl expose deployment myapp --port=8000 --target-port=80
查看svc
# kubectl describe svc myapp Name: myapp Namespace: default Labels: run=myapp Annotations: <none> Selector: run=myapp Type: ClusterIP IP: 10.99.71.37 Port: <unset> 8000/TCP TargetPort: 80/TCP Endpoints: 10.244.1.35:80,10.244.1.36:80 #service后端的两个pod Session Affinity: None Events: <none>
创建一个pod客户端访问service_name:service_port,可以看到service是随机的将请求分发到后端的两个pod的
# kubectl run client --image=busybox -it
/ # wget -O - -q http://myapp:8000/hostname.html
如果端口暴露类型为NodePort,那么可以通过集群内任意一台主机ip加暴露的端口进行访问
1. # kubectl edit svc myapp 修改service的type为NodePort
ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务
2. 也可以在创建service时指定type
kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --
type
=NodePort
# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26d <none>
nginx80 NodePort 10.105.125.134 <none> 80:32441/TCP 35m run=nginx-deploy
使用集群外客户端访问,需要使用集群任意一个节点的IP地址加上暴露的端口号
kubectl scale --replicas=5 deployment nginx-deploy # replicas指定pod数即可
将镜像升级为1.16-alpine:
# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.16-alpine --record deployment.extensions/nginx-deploy image updated
另开一个窗口监控升级过程:
# kubectl get pod -w
升级完成后查看:
# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-56457775df-ptx9f 1/1 Running 0 2m25s
# kubectl get deployment -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx-deploy 1/1 1 1 23d nginx-deploy nginx:1.16-alpine run=nginx-deploy
# kubectl describe pod nginx-deploy-56457775df-ptx9f
# kubectl rollout undo deployment/nginx-deploy
deployment.extensions/nginx-deploy rolled back
--to-revision 参数可以指定回退的版本
# kubectl rollout undo deploy/nginx-deploy --to-revision=1
# kubectl rollout history deployment/nginx-deploy #查看历史版本
这里CHANGE-CAUSE显示为空是因为操作deployment的时候没有加--record。如果加上应该显示:
原文:https://www.cnblogs.com/xiaobaozi-95/p/11607834.html