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版本:
创建一个Pod,使用myapp:v1镜像;kubectl run nginx --image=myapp:v1 由于在创建Pod的时后并未指定namespace,所以创建位置在默认里 查看Pod详细信息:kubectl get pod -o wide 一般server2作为调度节点不会参与部署,此处不同于swarm; 此时,该Pod只能在集群内部访问,集群内部也可互相访问 此时,在harbor中准备busyboxplus并运行:kubectl run demo --image=busyboxplus -it 若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,可随时创建和回收: 对该应用拉伸:kubectl scale deployment --replicas=2 nginx 因为使用了私有仓库,所以在拉伸时速度很快:
- seervice是一个抽象概念,定义了一个服务的多个Pod逻辑合集和访问Pod的策略,一般把service称为微服务(例如实现集群负载均衡)
- 暴露端口:
kubectl expose deployment nginx --port=80 - 此时Pod客户端可以通过service的名称访问后端的3个Pod
- ClusterIP:默认类型,自动分配一个仅集群内部可以副访问的虚拟IP,包括其他加入集群的虚拟机
- 查看创建的服务(查看其中服务暴露的端口):
kubectl get svc 解析该服务IP,可看到已实现负载均衡:curl 10.107.23.70/hostname.html 若查看服务的具体细节:kubectl get svc nginx 可看到,其中包含的3个IP地址即为内部3个容器的地址
若要被集群外部访问,使用Nodeort类型暴露端口,让外部客户端访问Pod
- 需要更改svc类型:
kubectl edit svc nginx - NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过NodeIP:Nodeort来访问服务
- 在真机上,通过虚拟机IP地址加查询暴露的端口号即可访问:
1.3 更新Pod镜像与回滚
更新镜像:kubectl set image deployment nginx myapp=myapp:v2 回滚:
- 查看历史版本:
kubectl rollout history deployment nginx - 回滚:
kubectl rollout undo deployment nginx --to-revision=1
2. 资源清单
删掉上节的deployments中的nginx,和svc中的nginx 查看api版本:kubectl api-versions
2.1 创建Pod清单
创建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 由于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
此外,还可以指定容器的资源控制的上下限:
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
查看节点标签:kubectl show nodes --show-labels 将所有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
包含两个镜像的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
若要连接:kubectl attach nginx-597468cf8f-6zpgg -c busyboxplus -it 此时,进到该容器内部,是可以看到本机的发布目录的,由另一个容器myapp发布: 即证明了同一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
则运行时最终会报错: 查看错误日至,端口已被占用: 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 个人理解,打标签时为了更方便的管理Node和Pod
|