kubernetes&&基础学习
- k8s架构图
- 常见插件
- CoreDNS
- Dashboard
- INGRESS CONTROLLER
- FEDERATION
- Prometheus
- EFK
- Pod
- 概念
- Pod控制器类型
- ReplicationController & ReplicaSet & Deployment
- StatefullSet
- DaemonSet
- Job,Cronjob
- 服务发现
- 网络通讯方式
- k8s如何实现网络通讯
- Flannel如何运行
- etcd的作用
- 网络类型
- k8s集群的部署
- 部署koolshare
- 部署Harbor
- 部署master节点
- 部署node节点
- 部署私有镜像仓库harbor
- k8s集群从私有镜像仓库下载镜像
- 资源清单
- k8s中的资源
- 名称空间级别
- 集群级资源
- 元数据型资源
- 资源清单
- 含义
- 常用字段解释说明
- 容器生命周期
- init容器
- 容器探针
pod是k8s的最小单位
pod是一组容器的集合
pod控制器监控一组容器的运行状态(动态移除、添加容器)
service
通过暴露(以ip加端口的方式),实现客户端对pod服务的访问。
有状态服务
系统运行过程中必须实时存在的服务,如DB,随意的移走会造成数据遗失。
无状态服务
系统运行过程中允许暂时更替的服务,如Apache,可随意更替功能配置相同服务的Apache
调度器
控制任意的pod运行在任意的节点
集群安全机制
集群的认证、鉴权、访问控制、原理及其流程
helm
类似yum、apt等软件安装工具,实现一条命令部署一个集群。
k8s架构图
scheduler将处理数据交给api server,api server将数据保存在etcd下。
高可用集群副本的数量建议是大于3的奇数
- api server
一切服务的访问入口,核心 - scheduler
接收任务,并分配任务到合适的节点(按节点资源分配) - replication controller
维持副本数量达到期望值。 - etcd
保存数据,以键值对方式存储。可信赖的分布式键值存储服务。
保存能够维持分布局集群持久稳定运行的配置文件信息。集群异常时可通过etcd存储的数据恢复。
v3 : 将数据保存在本地持久化卷上(建议)
v2 : 将数据保存在本地内存中(k8s1.11已弃用),若遇到,需定期手动数据备份 - kubelet
控制docker服务,创建容器,维持pod的生命周期。CRI(container runtime interface)。直接与容器引擎进行交互。 - kube proxy
实现客户端对服务资源的访问、实现pod集群的负载均衡。借助Firewalls防火墙实现。通过添加规则到iptables或ip_vs,实现服务的映射访问或负载均衡。
常见插件
CoreDNS
可以为集群中的SVC创建一个A记录(域名-ip的对应关系解析),实现通过域名对pod的访问。
Dashboard
为k8s集群提供一个B/S结构的访问体系
INGRESS CONTROLLER
实现七层代理,即实现基于域名的负载均衡
FEDERATION
提供一个可以跨集群中心的多k8s的统一管理功能
Prometheus
提供一个k8s集群的监控能力
EFK
提供一个k8s集群日志统一分析接入平台
Pod
概念
Pod管理一组容器(如一个LAMP环境,Apache容器+MySQL容器+PHP容器)
Pod启动时,首先产生(启动)一个默认的容器(名称为pause)。
同一个Pod内的一组容器共用pause的网络栈及存储卷。因此,同一个Pod内的一组容器间可通过localhost:port端口的方式互通访问资源,就好像在同一个容器内一样。
因此,同一个Pod内的一组容器之间端口不能相同(会冲突)。
同一个Pod内的一组容器,即共享网络又共享存储卷。
- 自主式Pod
非控制器管理的Pod,Pod一旦死亡不会被拯救、重置,而是放任不管。 - 控制器管理的Pod
Pod控制器类型
ReplicationController & ReplicaSet & Deployment
- ReplicationController
用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,则会自动创建新的Pod代替,且因为异常多出来的容器也会自动回收。
新版本的kubernetes中建议使用ReplicaSet来取代ReplicationController - ReplicaSet
ReplicaSet与ReplicationController没有本质的不同,只是名字不一样,且ReplicaSet支持集合式的selector
虽然ReplicaSet可以独立使用,但一般还是建议使用Deployment来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling-update,但Deployment支持) - Deployment
Deployment通过操控ReplicaSet实现容器的添加、删除等操作。
Deployment通过创建ReplicaSet达到创建Pod的目的。
HPA(HorizontalPodAutoScale)
Horizontal Pod Autoscaling 仅适用于Deployment和ReplicaSet,在V1版本中仅支持根据Pod的CPU利用率扩、缩容;在vlalpha版本中,支持根据内存和用户所定义的metric扩、缩容
StatefullSet
StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为了无状态服务而设计),其应用场景包括:
- 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC实现
- 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的service)来实现
- 有序部署、有序扩展,即Pod是有顺序的,在部署或者扩展的时候要根据定义的顺序依次进行(即从0到N-1,在下一个Pod运行之前,所有之前的Pod都必须已经是Running和Ready状态),基于init containers来实现。
- 有序收缩,有序删除(即从N-1到0)
DaemonSet
DaemonSet确保全部(或者一些)Node上运行一个(有且只有一个)Pod的副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod
使用DaemonSet的一些典型用法:
- 运行集群存储daemon,例如在每个Node上运行glusterd、ceph
- 在每个Node上运行日志收集daemon,例如fluentd、logstash
- 在每个Node上运行监控daemon,例如Prometheus Node Exporter
Job,Cronjob
Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束
通过监控任务是否正常执行结束和退出,确保任务一定成功的执行结束
CronJob 管理基于时间的Job,即:
- 在给定的时间点运行且仅运行一次
- 周期性在给定的时间点运行
服务发现
如何确保一些Pod属于同一组的Pod?同一组的Pod具有相干性,如同属于同一个Deployment所创建、或拥有同一组的标签等,同一组Pod具备相干性后,就容易被service所收集并划分成同一组。
service收集Pod是通过标签实现的。
service帮助Pod映射出IP和端口,实现客户端对Pod服务的使用
service支持RR(轮询)算法。
网络通讯方式
Kubernetes的网络模型假定了所有Pod都在一个可以直接连通的扁平(对于所有的Pod,均可以通过对方的ip直接到达)的网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,Kubernetes假定这个网络已经存在。而在私有云里搭建Kubernetes集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不同节点上的docker容器之间的互相访问先打通,然后运行kubernetes。
k8s如何实现网络通讯
同一个Pod内的多个容器之间通讯:通过共用pause容器内的网络栈实现,通过网络栈的IO实现。同一个Pod共享同一个网络命名空间,共享同一个Linux协议栈。
各Pod之间的通讯:通过overlay Network 实现。以Pod1和Pod2为例,若Pod1与Pod2不在同一台主机,Pod的地址是与docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP网段并且不同Node之前的通信只能通过宿主机的物理网卡进行。将pod的IP与所在Node的IP关联起来,通过这个关联让Pod可以互相访问。若Pod1与Pod2在同一台机器,则由docker0网桥直接转发请求至Pod2,因此不需要经过Flannel。
Pod和Service之间的通讯:通过各节点的IPtables规则实现,目前以LVS的转发和维护为主。
Pod到外网:Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主机网卡完成路由选择后,iptables执行Masquerade,把源IP更改为宿主网卡的IP,然后向外网服务器发送请求。(SNAT)
外网访问Pod:通过service实现
Flannel如何运行
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,他的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP地址之间建立一个覆盖网络(overlay Network),通过这个覆盖网络,将数据包原封不动的传递到目标容器内。
Flanneld:守护进程,会持续的监听特定端口,目标端口用于接收、转发数据包。Flanneld启动时会创建一个网桥Flannel0 10.1.15.0/16,网桥Flannel0专门用于收集Docker0送出的数据并实现数据包的二次封装,Flanneld使用UDP类型的数据报文转发数据。Docker0会为对应的Pod分配ip地址,
etcd的作用
ETCD之Flannel提供说明:
- 存储管理Flannel可分配的IP地址段资源
- 监控ETCD中每个Pod的实际地址,并在内存中建立维护Pod节点路由表
网络类型
service和pod网络均为虚拟网络;节点网络属于物理网络。
k8s集群的部署
如上图所示,当前的k8s集群由一个master主服务和和两个node工作节点组成。
Harbor为私有镜像仓库
Router为软路由(部署koolshare服务)
建议操作系统版本不低于CentOS7或内核版本在3.1以上
部署koolshare
部署Harbor
部署master节点
配合IP地址:192.168.66.10
#网卡的最新规范,其会从BIOS的pcre通道内获取网卡的最新信息.若没有,可再找eth0配置文件
vi /etc/sysconfig/network-scripts/ifcfg-ens33
#设置IP地址为静态IP地址,如192.168.66.10、20、21
设置系统主机名及host文件
hostnamectl set-hostname k8s-master01
#配置hosts文件,暂时写死IP-域名
vim /etc/hosts
192.168.66.10 k8s-master01
192.168.66.20 k8s-node01
192.168.66.21 k8s-node02
#将hosts文件通过scp命令发送到另外两个node节点
scp /etc/hosts root@k8s-node01:/etc/hosts
scp /etc/hosts root@k8s-node02:/etc/hosts
安装软件包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
设置防火墙为iptables并设置空规则
#关闭firewalld&&关闭自启动&&安装iptables-service管理工具&&启动iptables&&设置iptables为开机自启&&清空iptables防火墙规则&&保存iptables防火墙规则
systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
关闭SELINUX
#关闭虚拟内存&&永久关闭虚拟内存。避免出现容器运行在虚拟内存的意外情况。
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
#
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
调整内核参数,对于K8S
cat > kubernetes.conf << EOF
#开启网桥模式
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用swap空间,只有当系统OOMM时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
#复制文件到/etc/sysctl.d/目录下,实现文件开机被调用
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
#令配置文件生效
sysctl -p /etc/sysctl.d/kubernetes.conf
调整系统时区
#设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
#将当前的UTC时间写入硬件时钟
timedatectl set-local-rtc 0
#重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
关闭系统不需要服务
systemctl stop postfix && systemctl disable postfix
设置rsyslogd和systemd journald
mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf << EOF
[Journal]
# 持久化保存到磁盘
Storage=presistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald
升级系统内核为4.44
CentOS 7.x系统自带的3.10.x内核存在一些bug,导致运行的Docker、Kubernetes不稳定,例如: rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#采用elrepo源的安装方式,安装4.44版本内核
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#安装完成后检查/boot/grub2/grub.cfg中对应内核menuentry中是否包含initrd16配置,如果没有,再安装一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
#设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"
#重启服务器
reboot
#检测内核版本是否为4.44
uname -r
kube-proxy开启ipvs的前置条件
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
安装docker软件
# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 导入阿里云的docker-ce的镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum update -y && yum install -y docker-ce
# 此时系统内核版本应该已经不是4.44了,重新设置系统内核版本并重启服务器
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)" && reboot
#启动docker并设置为开机自启动
systemctl start docker && systemctl enable docker
# 创建 /etc/docker 目录
mkdir /etc/docker
# 配置daemon
cat > /etc/docker/daemon.json << EOF
{
"exec-opts" : ["native.cgroupdriver=systemd"],
"log-driver" : "json-file",
"log-opts" : {
"max-size" : "100m"
}
}
EOF
# 创建目录存放docker生成的配置文件
mkdir -p /etc/systemd/system/docker.service.d
# 重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
安装kubeadm(主从配置)
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
systemctl enable kubelet.service
# rz上传准备好的镜像文件
# 解压镜像文件
tar -zxvf kubeadm-basic.images.tar.gz
# 编写脚本读取镜像生成容器
vim load-images.sh
#!/bin/bash
ls /root/kubeadm-basic.images > /tmp/image-list.txt
cd /root/kubeadm-basic.images
for i in $( cat /tmp/image-list.txt )
do
docker load -i $i
done
rm -rf /tmp/image-list.txt
chmod a+x load-images.sh
./load-images.sh
#复制镜像和脚本到两个节点并加载镜像为容器
scp -r kubeadm-basic.images load-images.sh root@k8s-node01:/root/
scp -r kubeadm-basic.images load-images.sh root@k8s-node02:/root/
初始化主节点
#显示默认的init文件并打印至kubeadm-config.yaml文件中
kubeadm config print init-defaults > kubeadm-config.yaml
vim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers: kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.66.10
bindPort: 6443
--snip--
kubernetesVersion: v1.15.1
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs #设置默认调度方式为ip_vs方式
#初始化安装,指定配置文件,颁发证书 |
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
# 检查日志
cat kubeadm-init.log
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#检查都有哪些节点
kubectl get node
加入主节点以及其余工作节点
#执行安装日志中的加入命令即可
部署网络
kubectl apply -f
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl create -f kube-flannel.yml
kubectl get pod -n kube-system
# 此时kube-flannel组件已经成功运行了
kubectl get node
# 此时node节点已经处于ready状态了
在node分节点执行以下命令(在kubeadm-init.log日志文件中查看)加入node主节点
kubeadm join 192.168.66.10:6443 --token abcedf.0123456789abcdef --discovery-token-ca-cert-hash sha256:51e4c51e4c51e4c51e4c51e4clll
部署node节点
配合IP地址:192.168.66.20
#网卡的最新规范,其会从BIOS的pcre通道内获取网卡的最新信息.若没有,可再找eth0配置文件
vi /etc/sysconfig/network-scripts/ifcfg-ens33
#设置IP地址为静态IP地址,如192.168.66.10、20、21
设置系统主机名及host文件
hostnamectl set-hostname k8s-node01
安装软件包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
设置防火墙为iptables并设置空规则
systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
关闭SELINUX
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
部署私有镜像仓库harbor
配置docker配置文件
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"insecure-registries": ["https://hub.atguigu.com"]
}
# 重启docker生效
systemctl restart docker
由于此处使用的是自制证书,因此需要在每个物理机的daemon.json文件中配置““insecure-registries”: [“https://hub.atguigu.com”]”,声明私有docker镜像仓库是安全的
# 上传docker-compose
mv docker-compose /usr/local/bin/
chmod a+x /usr/local/bin/docker-compose
tar -zxvf harbor-offline-installer-v1.2.0.tgz
cd /usr/local/harbor
vim harbor.cfg
# 创建存储证书目录
mkdir -p /data/cert
# 创建https证书以及配置相关目录权限
openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key --out server.csr
cp server.key server.key.org
openssl rsa --in server.key.org --out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
mkdir /data/cert
chmod -R 777 /data/cert
# 运行脚本进行安装
cd /usr/local/harbor/
./install.sh
# 在每台物理机上固化域名解析
echo "192.168.66.100 hub.atguigu.com" >> /etc/hosts
客户端使用浏览器打开hub.atguigu.com访问测试,查看镜像仓库
docker 访问私有镜像仓库
docker login https://hub.atguigu.com
# 下载镜像
docker pull wangyanglinux/myapp:v1
# 自定义镜像标签
docker tag wangyanglinux/myapp:v1 hub.atguigu.com/library/myapp:v1
# 推送镜像到私有镜像仓库
docker push hub.atguigu.com/library/myapp:v1
k8s集群从私有镜像仓库下载镜像
# 启动一个pod,
kubectl run nginx-deployment --image=hub.atguigu.com/library/myapp:v1 --port=80 --replicas=1
kubectl get deployment
kubectl get rs
kubectl get pod -o wide
# 访问容器测试
curl 10.244.2.2
# 增加期望运行副本数
kubectl scale --replicas=3 deployment/nginx-deployment
kubectl expose deployment nginx-deployment --port=30000 --target-port=80
kubectl get svc
# 暴露 pod 的访问端口
kubectl edit svc nginx-deployment
type: NodePort
kubectl get svc
# 此时客户端可以通过暴露的端口访问node内服务
–replicas=1 : 副本数为1
资源清单
k8s中的资源
名称空间级别
仅在此名称空间下失效。
工作负载型资源(workload):
Pod,ReplicaSet,Deployment.StatefulSet,DaemonSet,Job,CronJob(ReplicationController 在v1.11版本被废弃)
服务发现及负载均衡资源(ServiceDiscovery LoadBalance):
Service,Ingress,
配置与存储型资源:
Volume(存储卷),CSI(容器存储接口,可以扩展各种各样的第三方存储卷)
特殊类型的存储卷:
configMap(当配置中心来使用的资源类型),Secret(保存敏感数据),DownwardAPI(把外部环境中的信息输出给容器)
集群级资源
NameSpace,Node,Role,ClusterRole,RoleBinding,ClusterRoleBinding
元数据型资源
HPA,PodTemplate,LimitRange
根据一些指标去进行一定的操作
资源清单
含义
在k8s中,一般使用yaml格式的文件来创建符合我们预期期望的pod,这样的yaml文件我们一般称为资源清单
常用字段解释说明
pod模板
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
namespace: default
labels:
app: myapp
version: v1
spec:
containers:
- name: app
image: hub.atguigu.com/library/myapp:v1
# 创建pod
kubectl create -f pod.yaml
# 查看pod
kubectl get pod
容器生命周期
init C : 初始化容器,可以是零个或多个
init C 无法同时运行,只能运行完成结束一个再开始运行下一个。
init C 在pod生命周期的初始阶段运行并结束。
pause(pod的基础容器)在init C执行之前创建完成
main C : 主容器
readiness : 就绪检测,确认主容器是否已经部署完成并运行
liveness : 生存检测,确认主容器是否正常运行并提供服务(而未陷入假死状态)
kubectl调用》api,api通过etcd调用》kubelet》调用CRI,创建型新容器》创建pause基础容器》初始化容器(init C)
init容器
Pod能够具有多个容器,应用运行在容器里面,但是他也可能有一个或多个先于应用容器启动的Init容器
Init 容器与普通的容器非常像,除了如下两点:
- Init 容器总是运行到成功完成为止
- 每个Init容器都必须在下一个Init容器启动之前成功完成
如果Pod的Init容器失败,kubernetes会不断的重启该Pod,直到Init容器成功为止
如果Pod对应的restartPolicy为Never,它不会重新启动
Init容器的作用:
Init C 模板
Init C特殊说明:
Pod启动的第一个容器是pause容器,并非init C容器
“网络和数据卷初始化之后”指的是pause完成启动之后
更改Pod的运行状态:
# 查询当前Pod的运行状态
kubectl get pod
# 编辑目标Pod的运行状态
kubectl edit pod myapp-pod
容器探针
探测方式:
如何实现探针: