1. Pod基础管理
由于k8s时使用namespace隔离,所以要查看具体pod信息时,必须加上对应的namespace区间 kubectl describe pod coredns-7f6cbbb7b8-nz9cn -n kube-system pod也可以随时创建和回收,在手动删除pod时:kubectl delete pod *** -n kube-system 时,会自动重启,对于故障pod可尝试该方法排错
1.1 Pod建立,删除,查看
- Pod时可以创建和管理k8s计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个Pod都有一个唯一的IP
- 一个Pod类似一个碗豆荚,包含一个或多个容器(通常是Docker),多个容器间共享IPC,Network和UTC namespace
此时在server1上提前准备好了harbor仓库,并包含myapp:v1,v2版本: ![请添加图片描述](https://img-blog.csdnimg.cn/47e7d6fc8b9b47eeb548b0a6ce9de3aa.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0ZhbmN5bGxfTGVl,size_16,color_FFFFFF,t_70)
创建一个Pod,使用myapp:v1镜像;kubectl run nginx --image=myapp:v1 由于在创建Pod的时后并未指定namespace,所以创建位置在默认里 ![请添加图片描述](https://img-blog.csdnimg.cn/a4e97d31a812493ba416a13267e8fa08.png) 查看Pod详细信息:kubectl get pod -o wide ![请添加图片描述](https://img-blog.csdnimg.cn/8e424addba9b4449acce3d1eb4d9107a.png) 一般server2作为调度节点不会参与部署,此处不同于swarm; 此时,该Pod只能在集群内部访问,集群内部也可互相访问 此时,在harbor中准备busyboxplus并运行:kubectl run demo --image=busyboxplus -it ![请添加图片描述](https://img-blog.csdnimg.cn/5e0a4f934b234eedbbf5f34e2bdb7601.png) 若pod内只有一个容器,再次进入该pod内的容器可执行:kubectl attach demo -it 删除容器:kubectl delete pod nginx
1.2 通过控制器创建Pod
生产环境用控制器较多,扩容缩容必须基于service控制器 创建:kubectl create deployment nginx --image=myapp:v1 此时,如果删除创建的Pod,则会自动创建一个新的Pod,控制器和rs不变,变的是容器id,可随时创建和回收: ![请添加图片描述](https://img-blog.csdnimg.cn/b10ee13494fb47b295c29f725f2d23ea.png) 对该应用拉伸:kubectl scale deployment --replicas=2 nginx ![在这里插入图片描述](https://img-blog.csdnimg.cn/ba27d8f4d0684b608d9cf69e8d468e85.png) 因为使用了私有仓库,所以在拉伸时速度很快: ![请添加图片描述](https://img-blog.csdnimg.cn/b62492600ce04ba0bcda580f5dbd461e.png)
- seervice是一个抽象概念,定义了一个服务的多个Pod逻辑合集和访问Pod的策略,一般把service称为微服务(例如实现集群负载均衡)
- 暴露端口:
kubectl expose deployment nginx --port=80 - 此时Pod客户端可以通过service的名称访问后端的3个Pod
- ClusterIP:默认类型,自动分配一个仅集群内部可以副访问的虚拟IP,包括其他加入集群的虚拟机
- 查看创建的服务(查看其中服务暴露的端口):
kubectl get svc ![请添加图片描述](https://img-blog.csdnimg.cn/fa940f4d38d8460ba3e302da2fa77b68.png) 解析该服务IP,可看到已实现负载均衡:curl 10.107.23.70/hostname.html ![请添加图片描述](https://img-blog.csdnimg.cn/3f5b350495314e7b9e4b58f77e2046dd.png) 若查看服务的具体细节:kubectl get svc nginx ![请添加图片描述](https://img-blog.csdnimg.cn/67fee763383d4dcc80acefb9327977cf.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0ZhbmN5bGxfTGVl,size_16,color_FFFFFF,t_70) 可看到,其中包含的3个IP地址即为内部3个容器的地址
若要被集群外部访问,使用Nodeort类型暴露端口,让外部客户端访问Pod
- 需要更改svc类型:
kubectl edit svc nginx ![请添加图片描述](https://img-blog.csdnimg.cn/f8c61cbf3a6e473a9c5d51b347fd6b16.png) ![请添加图片描述](https://img-blog.csdnimg.cn/5763a748fdb04c25a485c34dfe2e4ed1.png) - NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过NodeIP:Nodeort来访问服务
- 在真机上,通过虚拟机IP地址加查询暴露的端口号即可访问:
![请添加图片描述](https://img-blog.csdnimg.cn/99f5af8ea105436cb970284dbea4ebc8.png)
1.3 更新Pod镜像与回滚
更新镜像:kubectl set image deployment nginx myapp=myapp:v2 回滚:
- 查看历史版本:
kubectl rollout history deployment nginx ![请添加图片描述](https://img-blog.csdnimg.cn/4f2859d8f0eb4fafa4d400cc2cd40db4.png) - 回滚:
kubectl rollout undo deployment nginx --to-revision=1
2. 资源清单
删掉上节的deployments中的nginx,和svc中的nginx 查看api版本:kubectl api-versions ![请添加图片描述](https://img-blog.csdnimg.cn/5e82be861bd54e7a811164cc9ffc000d.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0ZhbmN5bGxfTGVl,size_16,color_FFFFFF,t_70)
2.1 创建Pod清单
![请添加图片描述](https://img-blog.csdnimg.cn/ed7f3ce3efaa4f3db31f72852c6d7a54.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0ZhbmN5bGxfTGVl,size_16,color_FFFFFF,t_70)
![请添加图片描述](https://img-blog.csdnimg.cn/8484d94ed0e74b8ebd8a25cae431fdc3.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0ZhbmN5bGxfTGVl,size_16,color_FFFFFF,t_70)
创建Pod提示:kubectl explain pod
首先编写一个简单的清单,除了指定api,类型,镜像拉取策略选择如果本地有就不从仓库拉取:
vim pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
spec:
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
执行清单:kubectl apply -f pod.yml ![请添加图片描述](https://img-blog.csdnimg.cn/524cbd5c57684c04be9e24c3b9957f21.png) 由于Pod没有控制器,所以在删除时,执行删除命令即可:kubectl delete -f pod.yml 好处是可以通过文件重复利用
2.2 创建Deployment清单
查看创建清单(例如spec)帮助:kubectl explain deployment.spec
vim -f pod.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 3
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
执行清单:kubectl apply -f pod.yml 此时,若要对镜像升级,只需要修改pod.yml文件中的镜像版本部分即可,然后在此执行yml文件,拉伸等同理。 若想快速获得部分清单内容,可将正在运行的类似服务导出yaml格式:kubectl deployments.apps -nginx -o yaml
![请添加图片描述](https://img-blog.csdnimg.cn/35882df47f6e468ca5798991d7bf5938.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0ZhbmN5bGxfTGVl,size_16,color_FFFFFF,t_70) 此外,还可以指定容器的资源控制的上下限:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 2
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 0.5
memory: 512Mi
![请添加图片描述](https://img-blog.csdnimg.cn/d8a2f27730dd4826b7d43d33ebdbbca1.png) 查看节点标签:kubectl show nodes --show-labels ![请添加图片描述](https://img-blog.csdnimg.cn/2ffbb1cf18014374be4f4bbf2d4cf4d1.png) 将所有Pod都放在指定节点上,可使用主机名或k8s标签:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 1
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
nodeSelector:
kubernetes.io/hostname: server4
#nodeName: server3
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
也可进一步设置网络为node节点IP:
#nodeSelector:
# kubernetes.io/hostname: server4
#nodeName: server4![请添加图片描述](https://img-blog.csdnimg.cn/6b3e645e5adb4b689808d3683ce33037.png)
hostNetwork: true
![请添加图片描述](https://img-blog.csdnimg.cn/ea72c2cedeb14d2ab9d3cd3a9dbca30d.png) 包含两个镜像的pod,其中增加的busybox打开交互式访问:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 1
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
#nodeSelector:
# kubernetes.io/hostname: server4
#nodeName: server3
hostNetwork: true
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 0.5
memory: 512Mi
- name: busyboxplus
image: busyboxplus
imagePullPolicy: IfNotPresent
stdin: true
tty: true
![请添加图片描述](https://img-blog.csdnimg.cn/512cdd0c13e745eb8850a6c09e9399ff.png) 若要连接:kubectl attach nginx-597468cf8f-6zpgg -c busyboxplus -it 此时,进到该容器内部,是可以看到本机的发布目录的,由另一个容器myapp发布: ![请添加图片描述](https://img-blog.csdnimg.cn/df17edf6014c4b8da421d401e1d7aa89.png) 即证明了同一pod内的资源包括网络是共享的 但是若两个容器的IP占用冲突:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 0.5
memory: 512Mi
- name: busyboxplus
image: busyboxplus
imagePullPolicy: IfNotPresent
stdin: true
tty: true
- name: game2048
image: game2048
imagePullPolicy: IfNotPresent
则运行时最终会报错: ![请添加图片描述](https://img-blog.csdnimg.cn/a4ab174200e84c2a83896af064780057.png) 查看错误日至,端口已被占用: ![请添加图片描述](https://img-blog.csdnimg.cn/34cc001fc63c44508193086d4e8ad74f.png) Node节点标签的添加,修改和删除: 查看Node节点标签:kubectl get nodes server3 --show-labels 添加:kubectl label nodes server3 app=nginx 修改:kubectl label nodes server3 app=myapp --overwrite 删除:kubectl label nodes server3 app-
Pod节点也可以设置标签: 查看:kubectl get pod --show-labels ![请添加图片描述](https://img-blog.csdnimg.cn/2b88bc73a8eb40c6acc648c5578e26ac.png) 个人理解,打标签时为了更方便的管理Node和Pod
|