Kubernetes部署及示例

news2024/11/15 13:09:34

目录

一、实验环境

二、部署

1、添加解析

2、安装docker,确保登录成功 

3、所有禁用swap和本地解析

4、 安装K8S部署工具

5、集群初始化 

6、安装flannel网络插件 

7、节点扩容

三、kubernetes 中的资源

1、资源管理介绍

2、资源管理方式

(1)命令式对象管理

(2)资源类型

四、什么是pod

1、创建自助式pod

2、利用控制器管理pod

3、应用版本的更新

4、利用yaml文件部署应用

(1)优点

(2)资源清单参数

(3)资源帮助命令

(4)示例

示例1:运行简单的单个容器pod

示例2:运行多个容器pod

示例3:理解pod间的网络整合

示例4:端口映射

示例5:如何设定环境变量

示例6:资源限制

示例7:选择运行节点

示例8:共享宿主机网络

五、pod的生命周期

1、init 容器的功能

init 容器示例

2、探针

存活探针示例

就绪探针示例


一、实验环境

k8s-master172.25.254.200
k8s-node1172.25.254.10
k8s-node2172.25.254.20
docker-node1             172.25.254.100(harbor仓库)

二、部署

1、添加解析

# 添加解析
[root@k8s-node2 ~]# vim /etc/hosts
[root@k8s-node2 ~]# cat /etc/hosts    # 三台主机都需要添加
172.25.254.200  k8s-master.zx.org
172.25.254.10 k8s-node1.zx.org
172.25.254.20 k8s-node2.zx.org

2、安装docker,确保登录成功 

 前形回顾——搭载私有仓库云

docker-node1(172.25.254.100)——搭载了私有仓库云的节点

见Docker容器技术_docker技术-CSDN博客

# 安装docker
[root@k8s-master ~]# ls
anaconda-ks.cfg  docker.tar.gz  Downloads  Pictures  Templates  zuoyedir
Desktop          Documents      Music      Public    Videos
[root@k8s-master ~]# tar zxf docker.tar.gz 
[root@k8s-master ~]# ls
anaconda-ks.cfg                               docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm  Pictures
containerd.io-1.7.20-3.1.el9.x86_64.rpm       docker-compose-plugin-2.29.1-1.el9.x86_64.rpm      Public
Desktop                                       docker.tar.gz                                      Templates
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm  Documents                                          Videos
docker-ce-27.1.2-1.el9.x86_64.rpm             Downloads                                          zuoyedir
docker-ce-cli-27.1.2-1.el9.x86_64.rpm         Music
[root@k8s-master ~]# dnf install *.rpm -y

[root@docker ~]# cd certs/
[root@docker certs]# ls
zx.org.crt  zx.org.key
[root@k8s-master ~]# mkdir /etc/docker/certs.d/reg.zx.org/ -p
# 传给三个主机
[root@docker-node1 certs]# scp /root/certs/zx.org.crt root@172.25.254.200:/etc/docker/certs.d/reg.zx.org/ca.crt

[root@k8s-master ~]# vim /etc/hosts    # 添加reg.zx.org的解析
[root@k8s-master ~]# docker login reg.zx.org
Username: zx
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

[root@k8s-master ~]# scp *.rpm root@172.25.254.10:/root
[root@k8s-master ~]# scp *.rpm root@172.25.254.20:/root
[root@k8s-node1 ~]# dnf install *.rpm -y
[root@k8s-node2 ~]# dnf install *.rpm -y
[root@k8s-master ~]# scp -r /etc/docker/ root@172.25.254.10:/etc/
[root@k8s-master ~]# scp -r /etc/docker/ root@172.25.254.20:/etc/
[root@k8s-node1 docker]# systemctl enable --now docker
[root@k8s-node2 docker]# systemctl enable --now docker

[root@k8s-node1 docker]# vim /etc/hosts    # 添加解析 reg.zx.org - 172.25.254.100
[root@k8s-node2 docker]# vim /etc/hosts

# 若harbor仓库出现登录不上的情况,则
[root@docker-node1 harbor]# ./install.sh --with-chartmuseum
[root@docker-node1 harbor]# docker compose stop
[root@docker-node1 harbor]# docker compose up -d

[root@docker-node1 harbor]# vim /etc/docker/daemon.json 
[root@docker-node1 harbor]# systemctl daemon-reload
[root@docker-node1 harbor]# systemctl restart docker
[root@docker-node1 harbor]# docker logout reg.zx.org
Removing login credentials for reg.zx.org
[root@docker-node1 harbor]# docker login reg.zx.org
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded
[root@docker-node1 harbor]# cat /etc/docker/daemon.json 
{
	"registry-mirrors": ["https://reg.zx.org","http://hub-mirror.c.163.com"]
}

3、所有禁用swap和本地解析

[root@k8s-node1 docker]# systemctl mask dev-nvme0n1p3.swap
Unit dev-nvme0n1p3.swap does not exist, proceeding anyway.
Created symlink /etc/systemd/system/dev-nvme0n1p3.swap → /dev/null.
[root@k8s-node1 docker]# swapoff -a

[root@k8s-node2 docker]# systemctl mask dev-nvme0n1p3.swap
Unit dev-nvme0n1p3.swap does not exist, proceeding anyway.
Created symlink /etc/systemd/system/dev-nvme0n1p3.swap → /dev/null.
[root@k8s-node2 docker]# swapoff -a

[root@k8s-master ~]# systemctl mask dev-nvme0n1p3.swap
Unit dev-nvme0n1p3.swap does not exist, proceeding anyway.
Created symlink /etc/systemd/system/dev-nvme0n1p3.swap → /dev/null.
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# vim /etc/fstab    # 注释swap后,需重启生效

4、 安装K8S部署工具

kubernetes镜像_kubernetes下载地址_kubernetes安装教程-阿里巴巴开源镜像站

[root@k8s-master ~]# mkdir /software
[root@k8s-master ~]# mv cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm /software/
[root@k8s-master ~]# cd /software/
[root@k8s-master software]# ls
cri-dockerd-0.3.14-3.el8.x86_64.rpm  libcgroup-0.41-19.el8.x86_64.rpm
[root@k8s-master software]# dnf install *.rpm -y
[root@k8s-master software]# systemctl start cri-docker

[root@k8s-master software]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm root@172.25.254.10:/software/
[root@k8s-master software]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm root@172.25.254.20:/software/

[root@k8s-node1 ~]# mkdir software/
[root@k8s-node1 ~]# dnf install /software/*.rpm -y
[root@k8s-node2 ~]# mkdir software/
[root@k8s-node2 ~]# dnf install /software/*.rpm -y

[root@k8s-master software]# systemctl enable --now cri-docker
[root@k8s-node1 ~]# systemctl enable --now cri-docker
[root@k8s-node2 ~]# systemctl enable --now cri-docker

[root@k8s-master yum.repos.d]# vim k8s.repo 
[root@k8s-master yum.repos.d]# cat k8s.repo 
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm
gpgcheck=0
[root@k8s-master yum.repos.d]# dnf makecache

[root@k8s-master ~]# dnf install kubelet-1.30.0-150500.1.1 kubeadm-1.30.0-150500.1.1 --downloadonly --downloaddir=/software
或[root@k8s-master ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 -y

[root@k8s-master ~]# dnf install bash-completion -y
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source  ~/.bashrc

#拉取k8s集群所需要的镜像
[root@k8s-master ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.11.1
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.12-0

情形回顾——构建企业级私有仓库

Docker容器技术_docker技术-CSDN博客

# 上传镜像到harbor仓库
[root@k8s-master yum.repos.d]# docker images | awk '/google/{ print $1":"$2}' | awk -F "/" '{system("docker tag "$0" reg.zx.org/k8s/"$3)}'
[root@k8s-master ~]# docker login reg.zx.org -u admin
# pull 的前提是得先在harbor仓库中创建k8s这个项目
[root@k8s-master yum.repos.d]# docker images  | awk '/k8s/{system("docker push "$1":"$2)}'

5、集群初始化 

#启动kubelet服务
[root@k8s-master ~]# systemctl status kubelet.service

#指定网络插件名称及基础容器镜像    
[root@k8s-master ~]# vim /lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.zx.org/k8s/pause:3.9
[root@k8s-master ~]# systemctl daemon-reload 
[root@k8s-master ~]# systemctl restart cri-docker
[root@k8s-master ~]# ll /var/run/cri-dockerd.sock
srw-rw---- 1 root docker 0 Sep 10 09:26 /var/run/cri-dockerd.sock
[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service root@172.25.254.10:/lib/systemd/system/cri-docker.service
[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service root@172.25.254.20:/lib/systemd/system/cri-docker.service
[root@k8s-node1 ~]# systemctl daemon-reload
[root@k8s-node2 ~]# systemctl daemon-reload
[root@k8s-node1 ~]# systemctl restart cri-docker
[root@k8s-node2 ~]# systemctl restart cri-docker

#执行初始化命令
[root@k8s-master ~]# kubeadm init --pod-network-cidr=172.25.0.0/16 --image-repository reg.zx.org/k8s --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock

[root@k8s-master ~]# kubeadm config images list
I0910 11:54:29.962229   41325 version.go:256] remote version is much newer: v1.31.0; falling back to: stable-1.30
registry.k8s.io/kube-apiserver:v1.30.4
registry.k8s.io/kube-controller-manager:v1.30.4
registry.k8s.io/kube-scheduler:v1.30.4
registry.k8s.io/kube-proxy:v1.30.4
registry.k8s.io/coredns/coredns:v1.11.1
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.12-0

[root@k8s-master ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock    # 若初始化失败,则重置

https://zhuanlan.zhihu.com/p/713589407

6、安装flannel网络插件 

#指定集群配置文件变量
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
#当前节点没有就绪,因为还没有安装网络插件,容器没有运行
[root@k8s-master ~]# kubectl get nodes
NAME                STATUS     ROLES           AGE     VERSION
k8s-master.zx.org   NotReady   control-plane   5m41s   v1.30.0
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s-master ~]# source ~/.bash_profile

[root@k8s-master ~]# vim kube-flannel.yml     # 将镜像下载地址改成本地(image)
[root@k8s-master ~]# grep -n image kube-flannel.yml    #需要修改以下几行
146:        image: flannel/flannel:v0.25.5
173:        image: flannel/flannel-cni-plugin:v1.5.1-flannel1
184:        image: flannel/flannel:v0.25.5

[root@k8s-master ~]# docker load -i flannel-0.25.5.tag.gz 

# docker仓库中新建flannel项目
# 打标签上传
[root@k8s-master ~]# docker tag flannel/flannel:v0.25.5 
[root@k8s-master ~]# docker push reg.zx.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 
[root@k8s-master ~]# docker push reg.zx.org/flannel/flannel-cni-plugin:v1.5.1-flannel1

#安装flannel网络插件
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml 
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

[root@k8s-master ~]# kubectl get nodes
NAME                STATUS   ROLES           AGE   VERSION
k8s-master.zx.org   Ready    control-plane   25m   v1.30.0

7、节点扩容

在所有的worker节点中

1 确认部署好以下内容

2 禁用swap

3 安装:

  • kubelet-1.30.0

  • kubeadm-1.30.0

  • kubectl-1.30.0

  • docker-ce

  • cri-dockerd

4 修改cri-dockerd启动文件添加

  • --network-plugin=cni

  • --pod-infra-container-image=reg.zx.org/k8s/pause:3.9

5 启动服务

  • kubelet.service

  • cri-docker.service

以上信息确认完毕后即可加入集群

# 在此阶段如果生成的集群token(初始化时生成)找不到了可以重新生成
[root@k8s-master ~]# kubeadm token create --print-join-command

[root@k8s-node1 ~]# kubeadm join 172.25.254.200:6443 --token lma300.jusxu3igmuk5dfym   --discovery-token-ca-cert-hash sha256:e107ffc608928f2337bf7742bc9b3024c6f7e179a15af2233e8092ae57c68a99 --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-node2 ~]# kubeadm join 172.25.254.200:6443 --token lma300.jusxu3igmuk5dfym   --discovery-token-ca-cert-hash sha256:e107ffc608928f2337bf7742bc9b3024c6f7e179a15af2233e8092ae57c68a99 --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-master ~]# kubectl get nodes 
NAME                STATUS   ROLES           AGE   VERSION
k8s-master.zx.org   Ready    control-plane   64m   v1.30.0
k8s-node1.zx.org    Ready    <none>          32m   v1.30.0
k8s-node2.zx.org    Ready    <none>          32m   v1.30.0

# 测试集群运行情况
[root@k8s-master ~]# kubectl run test --image nginx        #建立一个pod
pod/test created
[root@k8s-master ~]# kubectl get pods                      #查看pod状态

# 重新做集群
[root@k8s-master ~]# kubectl delete nodes k8s-node1.zx.org
[root@k8s-master ~]# kubectl delete nodes k8s-node2.zx.org
[root@k8s-master ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
# 重新做初始化集群
[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.zx.org/k8s \
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock

[root@k8s-master ~]# vim kube-flannel.yml    # 修改image
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml

[root@k8s-node1 ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-node2 ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock

# 再重新将节点加入集群
[root@k8s-node1 ~]# kubeadm join 172.25.254.200:6443 --token lma300.jusxu3igmuk5dfym   --discovery-token-ca-cert-hash sha256:e107ffc608928f2337bf7742bc9b3024c6f7e179a15af2233e8092ae57c68a99 --cri-socket=unix:///var/run/cri-dockerd.sock

[root@k8s-node2 ~]# kubeadm join 172.25.254.200:6443 --token lma300.jusxu3igmuk5dfym   --discovery-token-ca-cert-hash sha256:e107ffc608928f2337bf7742bc9b3024c6f7e179a15af2233e8092ae57c68a99 --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-master ~]# kubectl get nodes 

三、kubernetes 中的资源

1、资源管理介绍

  • 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。

  • kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务

  • 所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。

  • kubernetes的最小管理单元是pod而不是容器,只能将容器放在Pod中,

  • kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。

  • Pod中服务服务的访问是由kubernetes提供的Service资源来实现。

  • Pod中程序的数据需要持久化是由kubernetes提供的各种存储系统来实现

2、资源管理方式

  • 命令式对象管理:直接使用命令去操作kubernetes资源

    kubectl run nginx-pod --image=nginx:latest --port=80

  • 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源

    kubectl create/patch -f nginx-pod.yaml

  • 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源

    kubectl apply -f nginx-pod.yaml

类型适用环境优点缺点
命令式对象管理测试简单只能操作活动对象,无法审计、跟踪
命令式对象配置开发可以审计、跟踪项目大时,配置文件多,操作麻烦
声明式对象配置开发支持目录操作意外情况下难以调试

(1)命令式对象管理

 kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署

kubectl命令的语法如下:

kubectl [command] [type] [name] [flags]
  • comand:指定要对资源执行的操作,例如create、get、delete
  • type:指定资源类型,比如deployment、pod、service
  • name:指定资源的名称,名称大小写敏感
  • flags:指定额外的可选参数
# 查看所有pod
kubectl get pod 

# 查看某个pod
kubectl get pod pod_name

# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml

(2)资源类型

kubernetes中所有的内容都抽象为资源

kubectl api-resources
#显示集群版本
[root@k8s-master ~]# kubectl version
Client Version: v1.30.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.30.0

#显示集群信息
[root@k8s-master ~]# kubectl  cluster-info

#创建一个webcluster控制器,控制器中pod数量为2
[root@k8s-master ~]# kubectl create deployment webcluseter --image nginx --replicas 2

#查看控制器
[root@k8s-master ~]# kubectl get  deployments.apps

#查看资源帮助
[root@k8s-master ~]# kubectl explain deployment

#查看控制器参数帮助 
[root@k8s-master ~]# kubectl explain deployment.spec

[root@k8s-master ~]# kubectl run testpod --image nginx
pod/testpod created
[root@k8s-master ~]# kubectl run testpod1 --image nginx --dry-run=client -o yaml > testpod1.yml
[root@k8s-master ~]# ls
……    testpod1.yml    ……
                           
[root@k8s-master ~]# cat testpod1.yml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: testpod1
  name: testpod1
spec:
  containers:
  - image: nginx
    name: testpod1
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
[root@k8s-master ~]# kubectl create -f testpod1.yml 
pod/testpod1 created

[root@k8s-master ~]# docker load -i busyboxplus.tar.gz 
[root@k8s-master ~]# docker load -i myapp.tar.gz 

[root@k8s-master ~]# docker tag timinglee/myapp:v1 reg.zx.org/library/myapp:v1
[root@k8s-master ~]# docker tag timinglee/myapp:v2 reg.zx.org/library/myapp:v2
[root@k8s-master ~]# docker tag busyboxplus:latest reg.zx.org/library/busyboxplus:latest

[root@k8s-master ~]# docker push reg.zx.org/library/myapp:v1
[root@k8s-master ~]# docker push reg.zx.org/library/myapp:v2
[root@k8s-master ~]# docker push reg.zx.org/library/busyboxplus

[root@k8s-master ~]# kubectl cluster-info     #显示集群信息

[root@k8s-master ~]# kubectl run web --image reg.zx.org/library/myapp:v1
[root@k8s-master ~]# kubectl create deployment webcluster --image reg.zx.org/library/myapp:v1 --replicas 3

#查看控制器
[root@k8s-master ~]# kubectl get  deployments.apps
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
webcluster   3/3     3            3           67s
 
#查看资源帮助
[root@k8s-master ~]# kubectl explain deployment

#查看控制器参数帮助 
[root@k8s-master ~]# kubectl explain deployment.spec

#编辑控制器配置
[root@k8s-master ~]# kubectl edit deployments.apps webcluster 
deployment.apps/webcluster edited


#利用补丁更改控制器配置
[root@k8s-master ~]# kubectl patch  deployments.apps webcluster -p '{"spec":{"replicas":2}}' 
deployment.apps/webcluster patched
[root@k8s-master ~]# kubectl get  deployments.apps
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
webcluster   2/2     2            2           108s


# 删除资源
[root@k8s-master ~]# kubectl delete deployments.apps webcluster 
deployment.apps "webcluster" deleted

​​​​​​​

# 运行和调试命令示例
# 运行pod
[root@k8s-master ~]# kubectl run web1 --image reg.zx.org/library/myapp:v1

[root@k8s-master ~]# kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
web                          1/1     Running   0          12m
web1                         1/1     Running   0          15s
webcluster-fc458bbdb-ht4w6   1/1     Running   0          3m29s
webcluster-fc458bbdb-xkcgh   1/1     Running   0          3m29s

# 端口暴漏
[root@k8s-master ~]# kubectl expose pod web1 --port 80 --target-port 80
service/web exposed
[root@k8s-master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   21m
web1         ClusterIP   10.98.161.194   <none>        80/TCP    6s

#查看资源详细信息 
[root@k8s-master ~]# kubectl describe pods web 
[root@k8s-master ~]# curl 10.98.161.194
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

#利用命令生成yaml模板文件
[root@k8s-master ~]# kubectl run zx --image reg.zx.org/library/myapp:v1 --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: zx
  name: zx
spec:
  containers:
  - image: myapp:v1
    name: zx
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
[root@k8s-master ~]# kubectl run zx --image reg.zx.org/library/myapp:v1 --dry-run=client -o yaml > zx.yml
[root@k8s-master ~]# kubectl create deployment zx --image reg.zx.org/library/myapp:v1 --dry-run=client -o yaml > deployment-zx.yml
[root@k8s-master ~]# vim deployment-zx.yml 
[root@k8s-master ~]# kubectl apply -f deployment-zx.yml 
deployment.apps/zx created
[root@k8s-master ~]# kubectl get deployments.apps zx
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
zx     0/1     1            0           11s

[root@k8s-master ~]# kubectl delete -f deployment-zx.yml 
deployment.apps "zx" deleted

#查看资源详细信息 
[root@k8s-master ~]# kubectl describe pods web

#查看资源日志
[root@k8s-master ~]# kubectl logs pods/web1
10.244.0.0 - - [13/Sep/2024:00:54:07 +0000] "GET / HTTP/1.1" 200 65 "-" "curl/7.76.1" "-"

#运行交互pod
[root@k8s-master ~]# kubectl run -it testpod --image reg.zx.org/library/busyboxplus
If you don't see a command prompt, try pressing enter.        #ctrl+pq退出不停止pod
/ # 
/ # ls
bin      etc      lib      linuxrc  mnt      proc     run      sys      usr
dev      home     lib64    media    opt      root     sbin     tmp      var
/ # Session ended, resume using 'kubectl attach testpod -c testpod -i -t' command when the pod is running

#运行非交互pod
[root@k8s-master ~]# kubectl run myapp --image reg.zx.org/library/myapp:v1 

#进入到已经运行的容器,且容器有交互环境
[root@k8s-master ~]# kubectl attach pods/testpod -it
If you don't see a command prompt, try pressing enter.
/ # 

#在已经运行的pod(myapp)中运行指定命令,可进入交互模式
[root@k8s-master ~]# kubectl exec -it pods/myapp /bin/ash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # 
/ # ls
bin    dev    etc    home   lib    media  mnt    proc   root   run    sbin   srv    sys    tmp    usr    var
/ # 

[root@k8s-master ~]# kubectl cp anaconda-ks.cfg myapp:/
[root@k8s-master ~]# kubectl exec -it pods/myapp /bin/ash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ls
anaconda-ks.cfg  etc              media            root             srv              usr
bin              home             mnt              run              sys              var
dev              lib              proc             sbin             tmp
/ # touch 1.txt
/ # ls
1.txt            dev              lib              proc             sbin             tmp
anaconda-ks.cfg  etc              media            root             srv              usr
bin              home             mnt              run              sys              var
/ # exec attach failed: error on attach stdin: read escape sequence
command terminated with exit code 126
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl cp myapp:/1.txt 1.txt
tar: removing leading '/' from member names

#利用命令生成yaml模板文件
[root@k8s-master ~]# kubectl create deployment --image reg.zx.org/library/nginx:latest webcluster --dry-run=client -o yaml > webcluster.yml

#利用yaml文件生成资源
[root@k8s-master ~]# kubectl apply -f webcluster.yml 
deployment.apps/webcluster created
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get deployments.apps 
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
webcluster   1/1     1            1           7s

#管理资源标签
[root@k8s-master ~]# kubectl run nginx --image reg.zx.org/library/nginx:latest
pod/nginx created
[root@k8s-master ~]# kubectl get pods --show-labels 
NAME                          READY   STATUS    RESTARTS   AGE    LABELS
myapp                         1/1     Running   0          21m    run=myapp
nginx                         1/1     Running   0          12s    run=nginx
testpod                       1/1     Running   0          23m    run=testpod
web                           1/1     Running   0          43m    run=web
web1                          1/1     Running   0          31m    run=web1
webcluster-645f4d7468-hk4tx   1/1     Running   0          109s   app=webcluster,pod-template-hash=645f4d7468
[root@k8s-master ~]# kubectl label pods nginx app=zx
pod/nginx labeled
[root@k8s-master ~]# kubectl get pods --show-labels 
NAME                          READY   STATUS    RESTARTS   AGE    LABELS
myapp                         1/1     Running   0          21m    run=myapp
nginx                         1/1     Running   0          31s    app=zx,run=nginx
testpod                       1/1     Running   0          23m    run=testpod
web                           1/1     Running   0          43m    run=web
web1                          1/1     Running   0          31m    run=web1
webcluster-645f4d7468-hk4tx   1/1     Running   0          2m8s   app=webcluster,pod-template-hash=645f4d7468

#更改标签
[root@k8s-master ~]# kubectl label pods nginx app=webcluster --overwrite
pod/nginx labeled

#删除标签
[root@k8s-master ~]# kubectl label pods nginx app-
pod/nginx unlabeled
[root@k8s-master ~]# kubectl get pods --show-labels 
NAME                          READY   STATUS    RESTARTS   AGE     LABELS
myapp                         1/1     Running   0          22m     run=myapp
nginx                         1/1     Running   0          52s     app=webcluster,run=nginx
testpod                       1/1     Running   0          23m     run=testpod
web                           1/1     Running   0          43m     run=web
web1                          1/1     Running   0          32m     run=web1
webcluster-645f4d7468-hk4tx   1/1     Running   0          2m29s   app=webcluster,pod-template-hash=645f4d7468

#标签时控制器识别pod示例的标识
[root@k8s-master ~]# kubectl get pods nginx --show-labels
NAME    READY   STATUS    RESTARTS   AGE    LABELS
nginx   1/1     Running   0          119s   run=nginx

#删除pod上的标签
[root@k8s-master ~]# kubectl label pods webcluster-645f4d7468-hk4tx app-
pod/webcluster-645f4d7468-hk4tx unlabeled
#控制器会重新启动新pod
[root@k8s-master ~]# kubectl get pods --show-labels
NAME                          READY   STATUS              RESTARTS   AGE     LABELS
myapp                         1/1     Running             0          26m     run=myapp
nginx                         1/1     Running             0          4m52s   run=nginx
testpod                       1/1     Running             0          27m     run=testpod
web                           1/1     Running             0          47m     run=web
web1                          1/1     Running             0          36m     run=web1
webcluster-645f4d7468-4m7ck   0/1     ContainerCreating   0          5s      app=webcluster,pod-template-hash=645f4d7468
webcluster-645f4d7468-hk4tx   1/1     Running             0          6m29s   pod-template-hash=645f4d7468

四、什么是pod

  • Pod是可以创建和管理Kubernetes计算的最小可部署单元

  • 一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。

  • 一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker)

  • 多个容器间共享IPC、Network和UTC namespace。

1、创建自助式pod

优点:

灵活性高

  • 可以精确控制 Pod 的各种配置参数,包括容器的镜像、资源限制、环境变量、命令和参数等,满足特定的应用需求。

学习和调试方便

  • 对于学习 Kubernetes 的原理和机制非常有帮助,通过手动创建 Pod 可以深入了解 Pod 的结构和配置方式。在调试问题时,可以更直接地观察和调整 Pod 的设置。

适用于特殊场景

  • 在一些特殊情况下,如进行一次性任务、快速验证概念或在资源受限的环境中进行特定配置时,手动创建 Pod 可能是一种有效的方式。

缺点:

管理复杂

  • 如果需要管理大量的 Pod,手动创建和维护会变得非常繁琐和耗时。难以实现自动化的扩缩容、故障恢复等操作。

缺乏高级功能

  • 无法自动享受 Kubernetes 提供的高级功能,如自动部署、滚动更新、服务发现等。这可能导致应用的部署和管理效率低下。

可维护性差

  • 手动创建的 Pod 在更新应用版本或修改配置时需要手动干预,容易出现错误,并且难以保证一致性。相比之下,通过声明式配置或使用 Kubernetes 的部署工具可以更方便地进行应用的维护和更新。

2、利用控制器管理pod

高可用性和可靠性

  • 自动故障恢复:如果一个 Pod 失败或被删除,控制器会自动创建新的 Pod 来维持期望的副本数量。确保应用始终处于可用状态,减少因单个 Pod 故障导致的服务中断。

  • 健康检查和自愈:可以配置控制器对 Pod 进行健康检查(如存活探针和就绪探针)。如果 Pod 不健康,控制器会采取适当的行动,如重启 Pod 或删除并重新创建它,以保证应用的正常运行。

可扩展性

  • 轻松扩缩容:可以通过简单的命令或配置更改来增加或减少 Pod 的数量,以满足不同的工作负载需求。例如,在高流量期间可以快速扩展以处理更多请求,在低流量期间可以缩容以节省资源。

  • 水平自动扩缩容(HPA):可以基于自定义指标(如 CPU 利用率、内存使用情况或应用特定的指标)自动调整 Pod 的数量,实现动态的资源分配和成本优化。

版本管理和更新

  • 滚动更新:对于 Deployment 等控制器,可以执行滚动更新来逐步替换旧版本的 Pod 为新版本,确保应用在更新过程中始终保持可用。可以控制更新的速率和策略,以减少对用户的影响。

  • 回滚:如果更新出现问题,可以轻松回滚到上一个稳定版本,保证应用的稳定性和可靠性。

声明式配置

  • 简洁的配置方式:使用 YAML 或 JSON 格式的声明式配置文件来定义应用的部署需求。这种方式使得配置易于理解、维护和版本控制,同时也方便团队协作。

  • 期望状态管理:只需要定义应用的期望状态(如副本数量、容器镜像等),控制器会自动调整实际状态与期望状态保持一致。无需手动管理每个 Pod 的创建和删除,提高了管理效率。

服务发现和负载均衡

  • 自动注册和发现:Kubernetes 中的服务(Service)可以自动发现由控制器管理的 Pod,并将流量路由到它们。这使得应用的服务发现和负载均衡变得简单和可靠,无需手动配置负载均衡器。

  • 流量分发:可以根据不同的策略(如轮询、随机等)将请求分发到不同的 Pod,提高应用的性能和可用性。

多环境一致性

  • 一致的部署方式:在不同的环境(如开发、测试、生产)中,可以使用相同的控制器和配置来部署应用,确保应用在不同环境中的行为一致。这有助于减少部署差异和错误,提高开发和运维效率。

#建立控制器并自动运行pod
[root@k8s-master ~]# kubectl create deployment test --image reg.zx.org/library/nginx
deployment.apps/test created
[root@k8s-master ~]# kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
test-966c99d7-wfq5x   1/1     Running   0          6s

#扩容
[root@k8s-master ~]# kubectl scale deployment test --replicas 6
deployment.apps/test scaled
[root@k8s-master ~]# kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
test-966c99d7-csj9s   1/1     Running   0          14s
test-966c99d7-knvpp   1/1     Running   0          14s
test-966c99d7-msmgz   1/1     Running   0          14s
test-966c99d7-nfkff   1/1     Running   0          14s
test-966c99d7-wfq5x   1/1     Running   0          38s
test-966c99d7-z5w7m   1/1     Running   0          14s

#缩容
[root@k8s-master ~]# kubectl scale deployment test --replicas 2
deployment.apps/test scaled
[root@k8s-master ~]# kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
test-966c99d7-knvpp   1/1     Running   0          43s
test-966c99d7-nfkff   1/1     Running   0          43s

3、应用版本的更新

#利用控制器建立pod
[root@k8s-master ~]# kubectl create deployment test --image reg.zx.org/library/myapp:v1 --replicas 2

#暴漏端口
[root@k8s-master ~]# kubectl expose deployment test --port 80 --target-port 80
service/test exposed
[root@k8s-master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   105m
test         ClusterIP   10.99.228.45    <none>        80/TCP    9s

[root@k8s-master ~]# kubectl describe services test
Name:              test
Namespace:         default
Labels:            app=test
Annotations:       <none>
Selector:          app=test
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.99.228.45
IPs:               10.99.228.45
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.32:80,10.244.2.36:80        # 负载均衡
Session Affinity:  None
Events:            <none>


#访问服务
[root@k8s-master ~]# curl 10.99.228.45
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master ~]# curl 10.99.228.45/hostname.html
test-6b6b678b78-56vs4
[root@k8s-master ~]# curl 10.99.228.45/hostname.html
test-6b6b678b78-rbghr
[root@k8s-master ~]# curl 10.99.228.45/hostname.html
test-6b6b678b78-rbghr
[root@k8s-master ~]# curl 10.99.228.45/hostname.html
test-6b6b678b78-rbghr
[root@k8s-master ~]# curl 10.99.228.45/hostname.html
test-6b6b678b78-56vs4

#查看历史版本
[root@k8s-master ~]# kubectl rollout history deployment test
deployment.apps/test 
REVISION  CHANGE-CAUSE
1         <none>

#更新控制器镜像版本
[root@k8s-master ~]# kubectl set image deployments/test myapp=reg.zx.org/library/myapp:v2

#查看历史版本
[root@k8s-master ~]# kubectl rollout history deployment test
deployment.apps/test 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

#访问内容测试
[root@k8s-master ~]# curl 10.99.228.45
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

#版本回滚
[root@k8s-master ~]# kubectl rollout undo deployment test --to-revision 1
deployment.apps/test rolled back
#访问内容测试
[root@k8s-master ~]# curl 10.99.228.45
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

4、利用yaml文件部署应用

(1)优点

声明式配置

  • 清晰表达期望状态:以声明式的方式描述应用的部署需求,包括副本数量、容器配置、网络设置等。这使得配置易于理解和维护,并且可以方便地查看应用的预期状态。

  • 可重复性和版本控制:配置文件可以被版本控制,确保在不同环境中的部署一致性。可以轻松回滚到以前的版本或在不同环境中重复使用相同的配置。

  • 团队协作:便于团队成员之间共享和协作,大家可以对配置文件进行审查和修改,提高部署的可靠性和稳定性。

灵活性和可扩展性

  • 丰富的配置选项:可以通过 YAML 文件详细地配置各种 Kubernetes 资源,如 Deployment、Service、ConfigMap、Secret 等。可以根据应用的特定需求进行高度定制化。

  • 组合和扩展:可以将多个资源的配置组合在一个或多个 YAML 文件中,实现复杂的应用部署架构。同时,可以轻松地添加新的资源或修改现有资源以满足不断变化的需求。

与工具集成

  • 与 CI/CD 流程集成:可以将 YAML 配置文件与持续集成和持续部署(CI/CD)工具集成,实现自动化的应用部署。例如,可以在代码提交后自动触发部署流程,使用配置文件来部署应用到不同的环境。

  • 命令行工具支持:Kubernetes 的命令行工具 kubectl 对 YAML 配置文件有很好的支持,可以方便地应用、更新和删除配置。同时,还可以使用其他工具来验证和分析 YAML 配置文件,确保其正确性和安全性。

(2)资源清单参数

参数名称类型参数说明
versionString这里是指的是K8S API的版本,目前基本上是v1,可以用kubectl api-versions命令查询
kindString这里指的是yaml文件定义的资源类型和角色,比如:Pod
metadataObject元数据对象,固定值就写metadata
metadata.nameString元数据对象的名字,这里由我们编写,比如命名Pod的名字
metadata.namespaceString元数据对象的命名空间,由我们自身定义
SpecObject详细定义对象,固定值就写Spec
spec.containers[]list这里是Spec对象的容器列表定义,是个列表
spec.containers[].nameString这里定义容器的名字
spec.containers[].imagestring这里定义要用到的镜像名称
spec.containers[].imagePullPolicyString定义镜像拉取策略,有三个值可选: (1) Always: 每次都尝试重新拉取镜像 (2) IfNotPresent:如果本地有镜像就使用本地镜像 (3) )Never:表示仅使用本地镜像
spec.containers[].command[]list指定容器运行时启动的命令,若未指定则运行容器打包时指定的命令
spec.containers[].args[]list指定容器运行参数,可以指定多个
spec.containers[].workingDirString指定容器工作目录
spec.containers[].volumeMounts[]list指定容器内部的存储卷配置
spec.containers[].volumeMounts[].nameString指定可以被容器挂载的存储卷的名称
spec.containers[].volumeMounts[].mountPathString指定可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnlyString设置存储卷路径的读写模式,ture或false,默认为读写模式
spec.containers[].ports[]list指定容器需要用到的端口列表
spec.containers[].ports[].nameString指定端口名称
spec.containers[].ports[].containerPortString指定容器需要监听的端口号
spec.containers[] ports[].hostPortString指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突)
spec.containers[].ports[].protocolString指定端口协议,支持TCP和UDP,默认值为 TCP
spec.containers[].env[]list指定容器运行前需设置的环境变量列表
spec.containers[].env[].nameString指定环境变量名称
spec.containers[].env[].valueString指定环境变量值
spec.containers[].resourcesObject指定资源限制和资源请求的值(这里开始就是设置容器的资源上限)
spec.containers[].resources.limitsObject指定设置容器运行时资源的运行上限
spec.containers[].resources.limits.cpuString指定CPU的限制,单位为核心数,1=1000m
spec.containers[].resources.limits.memoryString指定MEM内存的限制,单位为MIB、GiB
spec.containers[].resources.requestsObject指定容器启动和调度时的限制设置
spec.containers[].resources.requests.cpuStringCPU请求,单位为core数,容器启动时初始化可用数量
spec.containers[].resources.requests.memoryString内存请求,单位为MIB、GIB,容器启动的初始化可用数量
spec.restartPolicystring定义Pod的重启策略,默认值为Always. (1)Always: Pod-旦终止运行,无论容器是如何 终止的,kubelet服务都将重启它 (2)OnFailure: 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则kubelet将不会重启它 (3) Never: Pod终止后,kubelet将退出码报告给Master,不会重启该
spec.nodeSelectorObject定义Node的Label过滤标签,以key:value格式指定
spec.imagePullSecretsObject定义pull镜像时使用secret名称,以name:secretkey格式指定
spec.hostNetworkBoolean定义是否使用主机网络模式,默认值为false。设置true表示使用宿主机网络,不使用docker网桥,同时设置了true将无法在同一台宿主机 上启动第二个副本

(3)资源帮助命令

kubectl explain pod.spec.containers

(4)示例

示例1:运行简单的单个容器pod
# 用命令获取yaml模板
[root@k8s-master ~]# kubectl run yml-test1 --image reg.zx.org/library/myapp:v1 --dry-run=client -o yaml > yml-test1.yml
[root@k8s-master ~]# cat yml-test1.yml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: yml-test1
  name: yml-test1
spec:
  containers:
  - image: reg.zx.org/library/myapp:v1
    name: yml-test1
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

示例2:运行多个容器pod

注意如果多个容器运行在一个pod中,资源共享的同时在使用相同资源时也会干扰,比如端口

在一个pod中开启多个容器时一定要确保容器彼此不能互相干扰

# 在示例1基础上实现
[root@k8s-master ~]# vim yml-test1.yml 
[root@k8s-master ~]# kubectl apply -f yml-test1.yml 
pod/yml-test1 created
[root@k8s-master ~]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
yml-test1               2/2     Running   0          11s
[root@k8s-master ~]# cat yml-test1.yml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: yml-test1
  name: yml-test1
spec:
  containers:
  - image: reg.zx.org/library/myapp:v1
    name: yml-test1
    resources: {}
  - image: reg.zx.org/library/nginx
    name: yml-test2
    command: ["/bin/sh","-c","sleep 1000000"]
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

示例3:理解pod间的网络整合

同在一个pod中的容器公用一个网络

[root@k8s-master ~]# vim yml-test1.yml 
[root@k8s-master ~]# kubectl apply -f yml-test1.yml 
pod/test created
[root@k8s-master ~]# kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
test        2/2     Running   0          7s
yml-test1   2/2     Running   0          6m37s
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl exec test -c busyboxplus -- curl -s localhost
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master ~]# 
[root@k8s-master ~]# cat yml-test1.yml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: yml-test1
  name: test
spec:
  containers:
  - image: reg.zx.org/library/myapp:v1
    name: myapp1
    resources: {}
  - image: reg.zx.org/library/busyboxplus:latest
    name: busyboxplus
    command: ["/bin/sh","-c","sleep 1000000"]

示例4:端口映射
[root@k8s-master ~]# kubectl run yml-test2 --image reg.zx.org/library/myapp:v1 --dry-run=client -o yaml > yml-test2.yml
[root@k8s-master ~]# vim yml-test2.yml 
[root@k8s-master ~]# kubectl apply -f yml-test2.yml 
pod/yml-test2 created
[root@k8s-master ~]# kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE     IP            NODE               NOMINATED NODE   READINESS GATES
test        2/2     Running   0          6m14s   10.244.1.33   k8s-node1.zx.org   <none>           <none>
yml-test1   2/2     Running   0          12m     10.244.2.37   k8s-node2.zx.org   <none>           <none>
yml-test2   1/1     Running   0          14s     10.244.1.34   k8s-node1.zx.org   <none>           <none>

[root@k8s-master ~]# curl k8s-node1.zx.org
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

[root@k8s-master ~]# cat yml-test2.yml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: yml-test2
  name: yml-test2
spec:
  containers:
  - image: reg.zx.org/library/myapp:v1
    name: yml-test2
    ports:
    - name: http
      containerPort: 80
      hostPort: 80
      protocol: TCP

示例5:如何设定环境变量
[root@k8s-master ~]# kubectl run yml-test3 --image reg.zx.org/library/busyboxplus:latest --dry-run=client -o yaml > yml-test3.yml
[root@k8s-master ~]# vim yml-test3.yml 
[root@k8s-master ~]# kubectl apply -f yml-test3.yml 
pod/yml-test3 created
[root@k8s-master ~]# cat yml-test3.yml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: yml-test3
  name: yml-test3
spec:
  containers:
  - image: reg.zx.org/library/busyboxplus:latest
    name: yml-test3
    command: ["/bin/sh","-c","echo $NAME;sleep 3000000"]
    env:
    - name: NAME
      value: zx
[root@k8s-master ~]# kubectl logs pods/yml-test3 yml-test3
zx

示例6:资源限制

资源限制会影响pod的Qos Class资源优先级,资源优先级分为Guaranteed > Burstable > BestEffort

QoS(Quality of Service)即服务质量

资源设定优先级类型
资源限定未设定BestEffort
资源限定设定且最大和最小不一致Burstable
资源限定设定且最大和最小一致Guaranteed
[root@k8s-master ~]# kubectl run yml-test4 --image reg.zx.org/library/myapp:v1 --dry-run=client -o yaml > yml-test4.yml
[root@k8s-master ~]# 
[root@k8s-master ~]# vim yml-test4.yml 
[root@k8s-master ~]# kubectl apply -f yml-test4.yml 
[root@k8s-master ~]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
yml-test4               1/1     Running   0          4s
[root@k8s-master ~]# cat yml-test4.yml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: yml-test4
  name: yml-test4
spec:
  containers:
  - image: reg.zx.org/library/myapp:v1
    name: yml-test4
    resources: 
      limits:
        cpu: 500m
        memory: 100M
      requests:
        cpu: 500m
        memory: 100M

示例7:选择运行节点
[root@k8s-master ~]# kubectl run yml-test6 --image reg.zx.org/library/myapp:v1 --dry-run=client -o yaml > yml-test6.yml
[root@k8s-master ~]# vim yml-test6.yml 
[root@k8s-master ~]# kubectl apply -f yml-test6.yml 
pod/yml-test6 created
[root@k8s-master ~]# kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE               NOMINATED NODE   READINESS GATES
test-6b6b678b78-wz8pt   1/1     Running   0          39m   10.244.1.37   k8s-node1.zx.org   <none>           <none>
[root@k8s-master ~]# cat yml-test6.yml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: yml-test6
  name: yml-test6
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1.zx.org
  containers:
  - image: reg.zx.org/library/myapp:v1
    name: yml-test6
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
示例8:共享宿主机网络
[root@k8s-master ~]# kubectl run yml-test7 --image reg.zx.org/library/busyboxplus:latest  --dry-run=client -o yaml > yml-test7.yml
[root@k8s-master ~]# vim yml-test7.yml 
[root@k8s-master ~]# kubectl apply -f yml-test7.yml 
pod/yml-test7 created
[root@k8s-master ~]# kubectl exec -it pods/yml-test7 -c busybox -- /bin/sh
/ # ifconfig

五、pod的生命周期

  • Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
  • Init 容器与普通的容器非常像,除了如下两点:
    • 它们总是运行到完成
    • init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。
  • 如果Pod的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。但是,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。

1、init 容器的功能

  • Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。

  • Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。

  • 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。

  • Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。

  • 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。

init 容器示例

[root@k8s-master ~]# mkdir pod
[root@k8s-master ~]# cd pod/
[root@k8s-master pod]# kubectl run init-test --image reg.zx.org/library/myapp:v1  --dry-run=client -o yaml > init-test.yml
[root@k8s-master pod]# vim init-test.yml 
[root@k8s-master pod]# kubectl apply -f init-test.yml 
pod/init-test created
[root@k8s-master pod]# kubectl get pods
NAME        READY   STATUS     RESTARTS   AGE
init-test   0/1     Init:0/1   0          6s
[root@k8s-master pod]# kubectl logs pods/init-test init-myservice 
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
[root@k8s-master pod]# kubectl exec pods/init-test -c init-myservice -- /bin/sh -c "touch /testfile"
[root@k8s-master pod]# kubectl get  pods 
NAME        READY   STATUS    RESTARTS   AGE
init-test   1/1     Running   0          68s
[root@k8s-master pod]# cat init-test.yml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: init-test
  name: init-test
spec:
  containers:
  - image: reg.zx.org/library/myapp:v1
    name: myapp
  initContainers:
    - name: init-myservice
      image: reg.zx.org/library/busyboxplus:latest
      command: ["sh","-c","until test -e /testfile;do echo wating for myservice; sleep 2;done"]

2、探针

探针是由 kubelet 对容器执行的定期诊断:

  • ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
  • TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
  • HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。

每次探测都将获得以下三种结果之一:

  • 成功:容器通过了诊断。
  • 失败:容器未通过诊断。
  • 未知:诊断失败,因此不会采取任何行动。

Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:

  • livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。
  • readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success。
  • startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success。

ReadinessProbe 与 LivenessProbe 的区别

  • ReadinessProbe 当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除。
  • LivenessProbe 当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施

StartupProbe 与 ReadinessProbe、LivenessProbe 的区别

  • 如果三个探针同时存在,先执行 StartupProbe 探针,其他两个探针将会被暂时禁用,直到 pod 满足 StartupProbe 探针配置的条件,其他 2 个探针启动,如果不满足按照规则重启容器。
  • 另外两种探针在容器启动后,会按照配置,直到容器消亡才停止探测,而 StartupProbe 探针只是在容器启动后按照配置满足一次后,不在进行后续的探测。

存活探针示例

[root@k8s-master ~]# kubectl run liveness --image reg.zx.org/library/myapp:v1  --dry-run=client -o yaml > liveness.yml
[root@k8s-master ~]# vim liveness.yml 
[root@k8s-master ~]# kubectl apply -f liveness.yml 
pod/liveness created
[root@k8s-master ~]# cat liveness.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: liveness
  name: liveness
spec:
  containers:
  - image: reg.zx.org/library/myapp:v1
    name: myapp
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 3
      periodSeconds: 1
      timeoutSeconds: 1
[root@k8s-master ~]# kubectl get pods -o wide
NAME        READY   STATUS             RESTARTS      AGE     IP            NODE               NOMINATED NODE   READINESS GATES
init-test   1/1     Running            0             19m     10.244.2.44   k8s-node2.zx.org   <none>           <none>
liveness    0/1     CrashLoopBackOff   6 (62s ago)   4m20s   10.244.1.43   k8s-node1.zx.org   <none>           <none>
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl describe pods liveness 

就绪探针示例

[root@k8s-master ~]# kubectl run readiness --image reg.zx.org/library/myapp:v1  --dry-run=client -o yaml > readiness.yml
[root@k8s-master ~]# vim readiness.yml 
[root@k8s-master ~]# kubectl apply -f readiness.yml 
pod/readiness created
[root@k8s-master ~]# kubectl get pods
NAME        READY   STATUS             RESTARTS        AGE
init-test   1/1     Running            0               30m
liveness    0/1     CrashLoopBackOff   9 (3m58s ago)   15m
readiness   0/1     Running            0               10s

[root@k8s-master ~]# kubectl expose pod readiness --port 80 --target-port 80
service/readiness exposed

[root@k8s-master ~]# kubectl describe pods readiness
……
Warning  Unhealthy  2s (x22 over 57s)  kubelet            Readiness probe failed: HTTP probe failed with statuscode: 404

[root@k8s-master ~]# kubectl describe services readiness
Name:              readiness
Namespace:         default
Labels:            run=readiness
Annotations:       <none>
Selector:          run=readiness
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.101.55.183
IPs:               10.101.55.183
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:                         #没有暴漏端口,就绪探针探测不满足暴漏条件
Session Affinity:  None
Events:            <none>

[root@k8s-master ~]# kubectl exec pods/readiness -c myapp -- /bin/sh -c "echo test > /usr/share/nginx/html/test.html"

[root@k8s-master ~]# kubectl get pods
NAME        READY   STATUS             RESTARTS       AGE
init-test   1/1     Running            0              42m
liveness    0/1     CrashLoopBackOff   15 (42s ago)   27m
readiness   1/1     Running            0              3m13s


[root@k8s-master ~]# kubectl describe service readiness
Name:              readiness
Namespace:         default
Labels:            run=readiness
Annotations:       <none>
Selector:          run=readiness
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.101.55.183
IPs:               10.101.55.183
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.44:80      #满组条件端口暴漏
Session Affinity:  None
Events:            <none>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2138188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Kubernetes】服务账号 Service Account

《K8s 的安全认证》系列&#xff0c;共包含以下文章&#xff1a; K8s 的安全框架和用户认证K8s 的鉴权管理&#xff08;一&#xff09;&#xff1a;基于角色的访问控制&#xff08;RBAC 鉴权&#xff09;K8s 的鉴权管理&#xff08;二&#xff09;&#xff1a;基于属性 / 节点…

Mac导入iPhone的照片怎么删除?快速方法讲解

随着Apple生态系统的高度整合&#xff0c;Mac与iPhone之间的照片同步和导入变得异常便捷。但这种便利有时也会带来一些管理上的困扰&#xff0c;比如Mac导入iPhone的照片怎么删除&#xff1f; 从iPhone直接删除照片 Mac导入iPhone的照片怎么删除&#xff1f;如果你的照片是通…

思维商业篇(1)—如何判断商业效率

思维商业篇(1)—如何判断商业效率 我们评价一个公司&#xff0c;很大程度上其实就是看其商业效率高不高以及规模大不大。 规模是一个企业的大小&#xff0c;效率是一个企业的节奏。 一个小企业如果效率很高&#xff0c;在未来就会有很多的机会。只要其所在行业在&#xff0c…

深入理解Python中的魔法参数 *args 和 **kwargs

在Python编程中&#xff0c;函数的灵活性是其强大之处之一。其中&#xff0c;*args 和 **kwargs 是实现函数参数可变性的重要工具。 无论我们是Python初学者还是经验丰富的开发者&#xff0c;充分理解这两个概念都有助于编写更加灵活、高效的代码。 本文将深入探讨*args和**kw…

【JavaScript】数据结构之树

什么是树形结构&#xff1f; 一种分层数据的抽象模型&#xff0c;用来分层级关系的。虚拟dom它所组织的那个数据原理就是树形结构 深度优先搜索&#xff08;遍历&#xff09;- 递归 从根出发&#xff0c;尽可能深的搜索树的节点技巧 访问根节点对根节点的children挨个进行深…

三、(JS)JS中常见的表单事件

一、onfocus、onblur事件 这个很容易理解&#xff0c;就不解释啦。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

【JS|第27期】网页文件传输:Blob与Base64的对决

日期&#xff1a;2024年9月12日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

【SQL】百题计划:SQL最基本的判断和查询。

[SQL]百题计划 Select product_id from Products where low_fats "Y" and recyclable "Y";

java重点学习-JVM组成

十二 JVM 12.1 JVM运行原理 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收机制 12.2 什么是程序计数器? 程序计数器:线程私有的&#xff08;不存在线程安全问题&#xff09;&…

美团图床设置教程

大厂图床&#xff0c;CDN加速 项目地址&#xff1a;https://github.com/woniu336/mt-img 使用方法 在mt.php填上你的token即可&#xff0c;然后打开index.html上传图片 获取token方法 注册https://czz.meituan.com/发布视频&#xff0c;上传封面&#xff0c;注意在上传封面后…

java项目之企业级工位管理系统源码(springboot)

项目简介 企业级工位管理系统实现了以下功能&#xff1a; 企业级工位管理系统的主要使用者管理员功能有个人中心&#xff0c;部门信息管理&#xff0c;工位信息管理&#xff0c;使用情况管理&#xff0c;工位分配管理。员工可以查看个人中心&#xff0c;部门信息&#xff0c;…

linux第二课(docker的安装使用)

目录 一.关于docker (1)背景引入 (2)docker介绍 (3)功能 (4)Docker架构 二.docker的安装及相关的命令 (1)docker的安装 (2)docker的配置 (3)docker镜像命令 (4)容器命令 三.docker安装myaql ​编辑 四.数据卷挂载 1.数据卷挂载引入 2.数据卷挂载图解 3.数据卷的安装…

通用四期ARM架构银河麒麟桌面操作系统V10【安装、配置FTP服务端】

一、操作环境 服务端&#xff1a;银河麒麟桌面操作系统V10SP1 &#xff08;服务端包链接&#xff1a;https://download.csdn.net/download/AirIT/89747026&#xff09; 客户端&#xff1a;银河麒麟桌面操作系统V10SP1 &#xff08;客户端包链接&#xff1a;https://downloa…

List<Map<String, Object>>汇总统计排序

开发环境&#xff1a;jdk 1.8 需求一&#xff1a; 1、统计每个小时(升序)不同事件的产品产量 2、统计不同事件&#xff08;OK 、NG&#xff09;的总产量 public static void main(String[] args) {//数据源List<Map<String, Object>> list new ArrayList<Map…

微信小程序开发第三课

1 wxml语法 1.1 模版语法 # 1 在页面 xx.js 的 Page() 方法的 data 对象中进行声明定义 # 2 在xx.wxml 中使用 {{}} 包裹&#xff0c;显示数据 # 3 可以显示如下&#xff0c;不能编写js语句或js方法-变量-算数运算-三元运算-逻辑判断# 4 只是单纯通过赋值&#xff0c;js中…

[Python学习日记-22] Python 中的字符编码(下)

[Python学习日记-22] Python 中的字符编码&#xff08;下&#xff09; 简介 编码的战国时代 Unicode 和 UTF 现代计算机系统通用的字符编码工作方式 简介 在[Python学习日记-21] Python 中的字符编码&#xff08;上&#xff09;中我们讲了字符编码中的 ASCII 码和 GB2312/G…

算法刷题:300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组、1143. 最长公共子序列

300. 最长递增子序列 1.dp定义&#xff1a;dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 2.递推公式&#xff1a;if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1); 注意这里不是要dp[i] 与 dp[j] 1进行比较&#xff0c;而是我们要取dp[j] 1的最大值…

【前端】ref引用的作用

首先&#xff0c;我们要明确一点&#xff0c;使用vue的好处是&#xff1a; 想要减少开发者直接操作dom元素。使用组件模版&#xff0c;实现代码的服用。 ref的属性的实现是为了取代原生js中使用id、class等标识来获取dom元素。 helloworld组件 <template><div clas…

memset函数的使用

目录 1.头文件 2.memset函数讲解 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#xff01; 1.头文件 memset函数的使用需要包括头文件 #include<string.h> 2.memset函数讲解 简述…

Java--图书管理系统(新版详细讲解)

前言&#xff1a; 对于初学者&#xff0c;自己写一个图书管理系统&#xff0c;会有效提高自己的代码能力&#xff0c;加深对Java中面向对象的理解&#xff0c;里面蕴含了Java中的类、接口、继承、多态等思想&#xff0c;接下来我们一起完成这一份"伟大的作品!" 注&am…