K8S高级应用的实例分析
更新:HHH   时间:2023-1-7


K8S高级应用的实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一 滚动更新镜像

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 指定历史版本序号
三 版本回滚
1 回滚上一个版本
 命令: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

十二 externalIPs

externalIPs 通过svc创建,在指定的node上监听端口

创建 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访问不受影响.

十三 Pod资源限制

定义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高级应用的实例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注天达云行业资讯频道了解更多相关知识。

返回云计算教程...