扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
K8S高级应用的实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
成都创新互联是一家专业提供科尔沁右翼前企业网站建设,专注与成都网站制作、网站设计、H5高端网站建设、小程序制作等业务。10年已为科尔沁右翼前众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。
1 通过命令直接指定镜像更新
命令: kubectl set image deployment [x.deployment] 镜像名称=镜像版本
例:创建一个nginx deployment nginx镜像版本为1.10
cat nginx-deployment.yaml apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.10 ports: - containerPort: 80 kubectl create -f nginx-deployment.yaml
使用curl 访问pod IP 查看nginx版本
curl -I podIP
执行更新镜像操作 将nginx镜像版本更新到nginx:1.11
kubectl set image deployment/nginx-deployment nginx=nginx:1.11
查看实时更新状态
kubectl rollout status deployment/x.deployment 注:x.deployment请自行匹配你自己的deployment
也可以从描述信息中查看,描述信息里面会记录完整的替换记录
kubectl describe deploy/x.deployment
值得注意的是:更新完镜像pod的IP 也会发生变化
2 修改配置更新镜像版本
命令: kubectl edit deploy [x-deployment]
修改:image: nginx:1.10 的版本即可
然后通过访问去验证。
3 通过打补丁方式滚动更新
例扩容为5个副本 kubectl patch deployment [x-deployment] -p '{"spec":{"replicas":5}}'
4 通过打补丁方式更新滚动更新策略
改变更新策略: 最大增加一个 最多不可用0个 kubectl pacth deployment [x-deployment] -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
5 金丝雀发布(即更新暂停)
以set image 为例子更新过程中暂停中 kubectl set image deploy x-deployment 镜像名称=镜像版本 && kubectl pause deployment x-deployment 继续更新 kubectl rollout resume deployment x-deployment
6 查看 rs
kubectl get rs -o wide
二 查看历史版本
命令 :kubectl rollout history deployment [x-deployment]
查看指定版本号查看详细的image信息
命令:kubectl rollout history deployment [x-deployment] --revision=nu --revisoin 指定历史版本序号
命令:kubectl rollout undo deployment [x-deployment]
可以使用describe 查看回滚信息
2 回滚到指定版本
命令:kubectl rollout undo deployment [x-deployment] --to-revision=n n 是使用 kubectl rollout undo history deployment [x-deployment] 查看出来的版本序号,如果你不知道需要回滚的版本徐使用命令查看
同样可以使用describe 查看回滚信息
四 自动扩容与缩容
自动扩容与缩容:是通过CPU阈值来控制:可以指定最小的数量和最多的数量
命令:kubectl autoscale deployment x-deployment --min=n --max=n --cpu-percent=n x-deployment 需要自动扩容的deployment --min 最小pod数量 --max 最大pod数量 --cpu-percent cpu阈值百分比 获取 autoscale kubectl delete hpa 删除 autoscale kubectl delete hpa x-deployment
五 service 与pod
服务发布是通过标签进行关联,通常创建了pod外部是无法访问的只能通过Podip进行访问,服务发布是将Pod暴露的端口映射到宿主机上面可以实现外部通过宿主机ip进行访问,能将两者关联到一起的便是标签的作用了。
类型 ExternalName, ClusterIP, NodePort, and LoadBalancer
ExternalName 访问外部应用通过此方式,内部DNS能够解析
ClusterIP service IP 也是vip service后面跟着 pod集群
NodePort 暴露node节点端口 k8s集群node可以访问
LoadBalancer 云服务的vlbaabs 可以通过 云原生负载均衡访问到servie 和 pods
ClusterIP hanldless 模式 : 直接设置 ClusterIP 为 none
1 创建一个nginx deployment 在发布一个服务将nginx端口暴漏出去
pod deployment:
cat nginx-deployment.yaml apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.10 ports: - containerPort: 80 kubectl create -f nginx-deployment.yaml
cat nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service labels: app: nginx spec: ports: - port: 88 targetPort: 80 selector: app: nginx kubectl create -f nginx-service.yaml
2 查看与验证
kubectl get svc or kubectl get svc nginx-service
会发现服务会生成一个虚拟VIP即是集群IP 和VIP的访问端口,在容器节点上访问 VIP:端口测试
3 查看服务相关联的Pod和Pod暴漏的端口
kubectl get ep x-service
4 还可以设置同一源地址访问到同一个pod上面
kubectl pacth svc myapp -p '{"spec:{"sessionAffinity":"ClientIp"}"}'
5 资源记录如果有CoreDns
SVC_NAME.NS_NAME.DOMAIN.LTD. svc.cluster.local. 示例: redis svc 记录 redis.default.svc.cluster.local.
六 重启策略
三种策略:
Always:当容器终止退出后,总是重启容器,默认策略。
OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
Never:当容器终止退出,从不重启容器。
使用restartPolicy 字段定义
例:创建一个deployment 区循环运行一个命令,进去容器手动kill掉进程,观察是否重启
cat testrestart.yaml apiVersion: v1 kind: Pod metadata: name: pod-test labels: test: centos spec: containers: - name: hello image: centos:6 command: ["bash","-c","while true;do date;sleep 1;done"] restartPolicy: OnFailure kubectl create -f testrestart.yaml
测试步骤:
1 找到pod所在节点
kubectl get pod -o wide
2 在节点查看进程
ps -ef | grep bash
3 手动kill
kill -9 进程ID
4 查看重启次数
kubectl get pod -o wide 查看RESTART那一栏的重启统计 或者 kubectl describe pod/pod-test 查看Restart Count 字段 注意:在使用describe时后面跟 pod 还是 deployment 是由yaml文件中 kind 决定的
七 Pod管理-健康检查
1 Pod健康检机制
提供Probe机制,有以下两种类型:
livenessProbe
如果检查失败,将杀死容器,然后根据Pod的重启策略来决定是否重启。
readinessProbe
如果检查失败,Kubernetes会把Pod从服务代理的分发后端剔除
Probe支持以下三种检查方法:
httpGet 发送HTTP请求,返回200-400范围状态码为成功。
exec 执行Shell命令返回状态码是0为成功。
tcpSocket 发起TCP Socket建立成功。
例: HttpGET 为健康检查的示例
vim health-httpget-test.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: nginx spec: containers: - name: nginx image: nginx:1.10 ports: - containerPort: 80 livenessProbe: httpGet: path: /index.html port: 80 kubectl create -f health-httpget-test.yaml
测试单容器返回404 时容器是否重启
1 进入容器删除index.html文件
kubectl exec nginx-pod -it bash cd /usr/share/nginx/html/ rm -rf index.html
2 查看描述信息
kubectl describe pod/nginx-pod
从描述信息中可以看出,容器被检查出404健康检查机制kill原来的容器重新创建了一个,但是我们通过kubectl get pod -o wide 查看发现容器虽然被重新创建但是他的IP却没有变.
八 Pod Nodeport 管理
K8S 的Port 分为: port ,targetPort , nodePort
Port: 供给集群其他的Container访问的端口
TargetPort:Pod中container 暴露的端口
nodePort:节点暴露端口
可以将宿主机的端口 映射个pod 从而进行访问
例:将容器的pod端口映射到宿主机节点的20088端口
创建Pod:
cat port.yaml apiVersion: v1 kind: Pod metadata: name: nginx10-pod labels: app: nginx10 spec: containers: - name: nginx10 image: nginx:1.10 ports: - name: http containerPort: 80 hostIP: 0.0.0.0 protocol: TCP - name: https containerPort: 443 hostIP: 0.0.0.0 protocol: TCP kubectl create -f port.yaml
创建Service:
cat nginx-pod-service.yaml kind: Service apiVersion: v1 metadata: name: nginx-pod-service spec: type: NodePort selector: app: nginx10 ports: - port: 8080 targetPort: 80 nodePort: 20088 protocol: TCP name: http - port: 8443 targetPort: 443 nodePort: 28443 protocol: TCP name: https kubectl create -f nginx-pod-service.yaml
示例中的yaml文件定义了 宿主机的20088端口和28443端口 分别映射了Pod的80和443 端口,8080端口是进群内的VIP
测试:
1 找到容器所在容器
kubectl get pod -o wide
2 查看svc
kubectl get svc
3 访问宿主机IP:20088
九 给集群设置固定IP
一个集群是需要一个vip做负载均衡的,在默认不指定的时候会自动生成一个dhcp的进群ip,手动设置只需要修改ymal文件,增加clusterIP 字段即可,要设置为apiserver配置文件指定的IP段,最好不好与集群中其他的地址段相同。
创建一组web pod cat nginx-deployment.yaml apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.10 ports: - containerPort: 80
创建服务并设置集群IP 10.1.110.111
cat nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service labels: app: nginx spec: ports: - port: 88 targetPort: 80 selector: app: nginx clusterIP: "10.1.110.111" kubectl create -f nginx-service.yaml
查看集群IP是否设置成功
kubectl get svc
节点上测试通过集群IP是否能够访问到WEB
curl -I 10.1.110.111:88
通过查看日志查看都反问道那些节点
kubectl logs -l app=nginx 通过标签名字
十 查看Pod的环境变量
命令: kubectl exec [Pod名称] env
十一 数据卷的使用
K8S的数据卷有十几种支持,比如emptyDir ,hostPath 网络数据卷包括nsf,iSCSI,Flocker glusterfs RBD cephfs gitRepo secret persistentVolumeClaim projected 等等。
今天简单介绍一下emptyDir ,hostPath和nfs在k8s中的使用
1 emptyDir
当 Pod分配到Node时,首先创建一个空卷,并挂载到Pod中的容器,Pod中的容器可以读写数据卷中文件,当Pod从节点中删除emptyDir,该数据也会被删除
cat emptyDir.yaml apiVersion: v1 kind: Pod metadata: name: test-pd namespace: kube-system spec: containers: - image: gcr.io/google_containers/test-webserver name: test-container volumeMounts: - mountPath: /cache name: cache-volume volumes: - name: cache-volume emptyDir: {} kubectl create -f emptyDir.yaml 查看volume信息使用 kubectl describe pods test-pd -n kube-system
描述信息显示 已经创建了一个名为cache-volume的卷,卷的类型为EmptyDir 并且它的生命周期是依据pod的生命周期
2 hostPath
一个hostpath卷挂载Node文件系统上的文件或者目录到Pod中的容器,挂在此类型目录需要宿主机已经存在的目录(可以是 文件 ,文件夹,或者 socket )
cat hostPath.yaml apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: nginx:1.12 name: test-container volumeMounts: - mountPath: /data name: test-volume volumes: - name: test-volume hostPath: path: /home/test type: Directory # directory location on host # path: /data kubectl create -f hostPath.yaml /home/test 宿主机的目录(需要已经存在) /data 容器的需要挂在的地方 详细信息可以使用describe查看
验证:
容器中/data 目录下创建文件
kubectl exec test-pd -it -- touch /data/a.txt
到容器宿主机相应的目录查看
ls /home/test/
3 网络数据卷NFS
安装NFS
yum install -y nfs*&&systemctl start nfs
创建NFS共享目录
mkdir /home/data
设置NFS共享 /home/data
vim /etc/exports 写入 :/home/data *(rw)
启动nfs
systemctl start nfs
授权
chmod 777 -R /home/data/
客户端测试 (需要安装showmount)
yum install -y showmount showmount -e nfs服务器IP
如果可以看到共享的目录说明nfs网络目录可以使用
编辑yaml文件
cat nfs.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.10 volumeMounts: - name: wwwroot mountPath: /var/www/html ports: - containerPort: 80 volumes: - name: wwwroot nfs: server: 10.10.25.149 path: /home/data kubectl create -f nfs.yaml
验证
进入到nfs目录创建测试文件
cd /home/data/ touch index.html
查看pod是否挂在了目录
kubectl exec nginx-deployment-8669f48cd4-4lvwd -it -- ls /var/www/html
编辑 index.html 文件
echo 'hello world' > /home/data/index.html
查看容器内部的index.html文件和我们编辑的内容是否相同
kubectl exec nginx-deployment-8669f48cd4-4lvwd -it -- cat /var/www/html/index.html
验证销毁Pod 数据时候存在
kubectl delete -f nfs.yaml 然后查看这个文件 cat /home/data/index.html
创建 deployment
# cat nginx10-deployment.yaml apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.10 ports: - containerPort: 80 kubectl create -f nginx10-deployment.yaml
创建service并设置externalIPs:
cat nginx-service.yaml kind: Service apiVersion: v1 metadata: name: nginx-deploy-service spec: type: NodePort selector: app: nginx ports: - port: 8080 targetPort: 80 protocol: TCP name: http externalIPs: - 10.10.25.150
查看svc
kubectl get svc
此时即可通过制定node节点的IP和端口访问.当然集群内serviceIP访问不受影响.
定义yaml文件pod的资源限制
apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: nginx spec: containers: - name: nginx image: nginx resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"
关于K8S高级应用的实例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流