k8s 安装
虚拟机安装 CentOS 7
下载系统安装镜像
- 地址:http://isoredirect.centos.org/centos/7/isos/x86_64/
- 可以下载CentOS-7-x86_64-Minimal-2009,大小 973MB
创建虚拟机
- 配置:CPU 2 核、内存 3G、硬盘 30G、网卡 桥接模式
- 两台虚拟机配置相同
虚拟机安装系统
- 虚拟机设置镜像为 Centos7的 iso文件
- 启动虚拟机安装,安装过程中:
- 设置一台命名 k8s-master,一台命名 k8s-node1
- 设置虚拟机 IP 地址,两台与宿主在同一网段,如
- 192.168.3.80(k8s-master)
- 192.168.3.81(k8s-node1)
- 设置 root 密码
- 安装完成后重启虚拟机
虚拟机系统配置
代码语言:javascript
复制
#在 root 下执行 | |
# 修改DNS | |
echo nameserver 192.168.3.1 > /etc/resolv.conf | |
# 验证 | |
ping www.baidu.com | |
# 升级所有包同时也升级软件和系统内核 | |
yum update -y | |
# 关闭防火墙 | |
systemctl stop firewalld | |
# 关闭防火墙自启动 | |
systemctl disable firewalld | |
# 禁用SELinux | |
setenforce 0 | |
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config | |
# 添加 host | |
vi /etc/hosts | |
192.168.3.80 k8s-master | |
192.168.3.81 k8s-node1 | |
# 转发 IPv4 并让 iptables 看到桥接流 | |
cat <<EOF | tee /etc/modules-load.d/k8s.conf | |
overlay | |
br_netfilter | |
EOF | |
modprobe overlay | |
modprobe br_netfilter | |
# 设置所需的 sysctl 参数,参数在重新启动后保持不变 | |
cat <<EOF | tee /etc/sysctl.d/k8s.conf | |
net.bridge.bridge-nf-call-iptables = 1 | |
net.bridge.bridge-nf-call-ip6tables = 1 | |
net.ipv4.ip_forward = 1 | |
EOF | |
# 应用 sysctl 参数而不重新启动 | |
sysctl --system | |
lsmod | grep br_netfilter | |
lsmod | grep overlay | |
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward | |
# 关闭swap分区: | |
vi /etc/fstab | |
# 注释掉 /dev/mapper/centos-swap swap | |
# 重启生效 | |
reboot |
安装 docker
代码语言:javascript
复制
# 添加docker官方yum源 | |
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo | |
# 安装 docker | |
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin | |
# 启动+自启动 | |
systemctl enable --now docker | |
# 查看状态 | |
systemctl status docker | |
# 验证安装 | |
docker run hello-world |
安装 cri-dockerd
代码语言:javascript
复制
# 安装 wget | |
yum install -y wget | |
# 下载 rpm | |
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el7.x86_64.rpm | |
# 安装 | |
rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm | |
# 重载系统守护进程 | |
systemctl daemon-reload | |
# 启动+自启动 | |
systemctl enable --now cri-docker.socket cri-docker | |
# 查看状态 | |
systemctl status cri-docker.socket |
安装runc
代码语言:javascript
复制
# 下载 | |
wget https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64 | |
# 安装 | |
install -m 755 runc.amd64 /usr/local/bin/runc | |
# 验证 | |
runc -v |
安装 kubectl
代码语言:javascript
复制
# 下载v1.27.4版本 | |
curl -LO "https://dl.k8s.io/release/v1.27.4/bin/linux/amd64/kubectl" | |
# 下载校验文件 | |
curl -LO "https://dl.k8s.io/v1.27.4/bin/linux/amd64/kubectl.sha256" | |
# 验证文件 | |
echo "$(cat kubectl.sha256) kubectl" | sha256sum --check | |
# 安装 | |
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl | |
# 验证安装 | |
kubectl version --client |
安装 kubeadm、kubelet 和 kubectl
代码语言:javascript
复制
# 配置yum文件,exclude 参数避免误更新 | |
cat <<EOF | tee /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=1 | |
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg | |
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg | |
exclude=kubelet kubeadm kubectl | |
EOF | |
# 安装 1.27.4 版本 | |
yum -y install kubelet-1.27.4 kubeadm-1.27.4 kubectl-1.27.4 --disableexcludes=kubernetes | |
# 查看安装情况 | |
yum list kubelet kubeadm kubectl | |
# 设置kubelet自启动 | |
systemctl enable --now kubelet |
设置 docker 和 cri-dockerd
代码语言:javascript
复制
# Docker设置国内镜像加速 | |
tee /etc/docker/daemon.json <<-'EOF' | |
{ | |
"registry-mirrors": [ | |
"https://docker.mirrors.ustc.edu.cn", | |
"http://hub-mirror.c.163.com" | |
], | |
"exec-opts": ["native.cgroupdriver=systemd"] | |
} | |
EOF | |
# cri-dockerd设置 | |
vi /usr/lib/systemd/system/cri-docker.service | |
# 找到第10行ExecStart= 修改为 | |
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7 | |
# 重启Docker组件 | |
systemctl daemon-reload && systemctl restart docker cri-docker.socket cri-docker | |
# 检查Docker组件状态 | |
systemctl status docker cri-docker.socket cri-docker |
搭建 k8s 集群
初始化 master:
代码语言:javascript
复制
# 初始化 master | |
kubeadm init --kubernetes-version=v1.27.3 --node-name=k8s-master \ | |
--image-repository=registry.aliyuncs.com/google_containers \ | |
--cri-socket=unix:///var/run/cri-dockerd.sock \ | |
--apiserver-advertise-address=192.168.3.80 \ | |
--pod-network-cidr=10.244.0.0/16 \ | |
--service-cidr=10.96.0.0/12 | |
# 假如初始化失败,需要回滚 | |
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock | |
# 成功后复制出:kubeadm join 语句用于到 k8s-node1 上执行 | |
# 如:kubeadm join 192.168.3.80:6443 --token rvh7p6.ymka5l4f8jeax53q \ | |
# --discovery-token-ca-cert-hash sha256:172ba55c505403eccafb197d0d0c4e7405870c5080f50290457cdd6962d9217b | |
# 设置 KUBECONFIG 环境变量 | |
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile | |
# 生效 | |
source ~/.bash_profile | |
# 检测配置是否生效 | |
echo $KUBECONFIG |
安装网络插件 flannel:
代码语言:javascript
复制
# 下载 kube-flannel.yml | |
# 地址 https://github.com/flannel-io/flannel/releases/tag/v0.22.0 | |
# 将文件 kube-flannel.yml 上传 k8s-master | |
# 部署 flannel | |
kubectl apply -f kube-flannel.yml | |
# 创建目录 | |
mkdir -p /run/flannel/ | |
# 创建 subnet.env 文件 | |
cat <<EOF | tee /run/flannel/subnet.env | |
FLANNEL_NETWORK=10.244.0.0/16 | |
FLANNEL_SUBNET=10.244.0.1/24 | |
FLANNEL_MTU=1450 | |
FLANNEL_IPMASQ=true | |
EOF |
加入node节点:
代码语言:javascript
复制
# 在 master 上执行 | |
# 将配置文件远程复制到 node1 | |
scp /etc/kubernetes/admin.conf 192.168.3.81:/etc/kubernetes/ | |
# 以下在 node1 上执行—————————— | |
# 确认配置文件 admin.conf 存在 | |
ls /etc/kubernetes | |
# 设置 KUBECONFIG 环境变量 | |
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile | |
# 生效 | |
source ~/.bash_profile | |
# 检测配置是否生效 | |
echo $KUBECONFIG | |
# 将 master 上执行 kubeadm init 时的 join 语句加上参数--cri-socket unix:///var/run/cri-dockerd.sock执行 | |
# 如以下语句: | |
kubeadm join 192.168.3.80:6443 --token rvh7p6.ymka5l4f8jeax53q \ | |
--discovery-token-ca-cert-hash sha256:172ba55c505403eccafb197d0d0c4e7405870c5080f50290457cdd6962d9217b \ | |
--cri-socket unix:///var/run/cri-dockerd.sock | |
#———————————————————————————— |
安装 dashboard
代码语言:javascript
复制
# 下载yaml | |
wget -O k8s-dashboard-v2.7.0.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml | |
# 修改yaml | |
vi k8s-dashboard-v2.7.0.yaml | |
# 在以下内容中修改 Service 如下: | |
# kind: Service | |
# apiVersion: v1 | |
# metadata: | |
# labels: | |
# k8s-app: kubernetes-dashboard | |
# name: kubernetes-dashboard | |
# namespace: kubernetes-dashboard | |
# spec: | |
# type: NodePort # 增加NodePort | |
# ports: | |
# - port: 443 | |
# targetPort: 8443 | |
# nodePort: 30001 # 指定端口号 | |
# selector: | |
# k8s-app: kubernetes-dashboard | |
# 部署 dashboard | |
kubectl apply -f k8s-dashboard-v2.7.0.yaml | |
# 查看 dashboard 访问端口 | |
kubectl -n kubernetes-dashboard get service kubernetes-dashboard | |
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE | |
# kubernetes-dashboard NodePort 10.107.209.165 <none> 443:30001/TCP 110m | |
# 创建文件 k8s-dashboard-account.yaml | |
touch k8s-dashboard-account.yaml | |
vi k8s-dashboard-account.yaml | |
# 修改为后面 yaml 内容 | |
# 创建账户和绑定角色 | |
kubectl apply -f k8s-dashboard-account.yaml | |
# 查看登录 token | |
kubectl -n kubernetes-dashboard describe secret dashboard-admin | |
# 或直接提取 token | |
kubectl -n kubernetes-dashboard get secrets dashboard-admin -o go-template --template '{{index .data "token"}}' | base64 --decode | |
# 将输出的 token 复制到 https://192.168.3.80:30001 登录使用 | |
# 修改 Dashboard token失效时间 | |
# 登录dashboard,在Deployments 下找到 kubernetes-dashboard,编辑 Yaml | |
# 查找“--auto-generate-certificates”,定位到修改位置 | |
# 增加参数 '--token-ttl=0' 表示永不过期,修改后如下: | |
# containers: | |
# - name: kubernetes-dashboard | |
# image: kubernetesui/dashboard:v2.7.0 | |
# args: | |
# - '--auto-generate-certificates' | |
# - '--namespace=kubernetes-dashboard' | |
# - '--token-ttl=0' |
k8s-dashboard-account.yaml内容:
代码语言:javascript
复制
apiVersion: v1 | |
kind: ServiceAccount | |
metadata: | |
name: dashboard-admin | |
namespace: kubernetes-dashboard | |
labels: | |
kubernetes.io/cluster-service: "true" | |
addonmanager.kubernetes.io/mode: Reconcile | |
kind: ClusterRoleBinding | |
apiVersion: rbac.authorization.k8s.io/v1 | |
metadata: | |
name: dashboard-admin-binding | |
annotations: | |
rbac.authorization.kubernetes.io/autoupdate: "true" | |
roleRef: | |
kind: ClusterRole | |
name: cluster-admin | |
apiGroup: rbac.authorization.k8s.io | |
subjects: | |
- kind: ServiceAccount | |
name: dashboard-admin | |
namespace: kubernetes-dashboard | |
apiVersion: v1 | |
kind: Secret | |
metadata: | |
name: dashboard-admin | |
namespace: kubernetes-dashboard | |
annotations: | |
kubernetes.io/service-account.name: "dashboard-admin" | |
type: kubernetes.io/service-account-token |
实验环境优化
- 解决kube-scheduler重启问题。
- kubeadm 未配置 scheduler 的服务端证书,健康检查采用https将会失败导致不断重启。
- 生成自签名证书,修改 scheduler 的 pod 配置增加启动参数。
- 单 master 时关闭竞选 leader。
- 多 master 时,组件存在多个实例需要不断竞选 leader。
- scheduler 和 controller-manager默认启动参数会使用竞选leader。
- 可以关掉避免一直对 apiserver 发请求。
- master 上各组件的探针频率默认 10s,可适度调低。
生成自签名证书:
代码语言:javascript
复制
mkdir ~/certs | |
cd ~/certs | |
#下载安装CFSSL证书生成工具 | |
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 | |
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 | |
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 | |
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo | |
mv cfssl_linux-amd64 /usr/local/bin/cfssl | |
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson | |
chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssl-certinfo /usr/local/bin/cfssljson | |
cat > ca-config.json <<EOF | |
{ | |
"signing": { | |
"default": { | |
"expiry": "876000h" | |
}, | |
"profiles": { | |
"kubernetes": { | |
"expiry": "876000h", | |
"usages": [ | |
"signing", | |
"key encipherment", | |
"server auth", | |
"client auth" | |
] | |
} | |
} | |
} | |
} | |
EOF | |
cat > ca-csr.json <<EOF | |
{ | |
"CN": "system:kube-scheduler", | |
"key": { | |
"algo": "rsa", | |
"size": 2048 | |
}, | |
"names": [ | |
{ | |
"C": "CN", | |
"ST": "BeiJing", | |
"L": "BeiJing", | |
"O": "system:kube-scheduler", | |
"OU": "System" | |
} | |
], | |
"ca": { | |
"expiry": "876000h" | |
} | |
} | |
EOF | |
cat > kube-scheduler-csr.json <<EOF | |
{ | |
"CN": "system:kube-scheduler", | |
"hosts": [ | |
"127.0.0.1", | |
"192.168.3.8", | |
"192.168.3.80", | |
"192.168.3.81", | |
"192.168.3.82" | |
], | |
"key": { | |
"algo": "rsa", | |
"size": 2048 | |
}, | |
"names": [ | |
{ | |
"C": "CN", | |
"ST": "BeiJing", | |
"L": "BeiJing" | |
} | |
] | |
} | |
EOF | |
#生成 CA 根证书 | |
cfssl gencert -initca ca-csr.json | cfssljson -bare ca | |
#生成 kube-scheduler 证书 | |
cfssl gencert -ca=ca.pem \ | |
-ca-key=ca-key.pem \ | |
-config=ca-config.json \ | |
-profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler | |
#确认已生成证书 | |
ls kube-scheduler*pem | |
#拷贝证书到k8s证书目录 | |
cp kube-scheduler.pem /etc/kubernetes/pki/scheduler.crt | |
cp kube-scheduler-key.pem /etc/kubernetes/pki/scheduler.key | |
#修改kube-scheduler.yaml | |
vi /etc/kubernetes/manifests/kube-scheduler.yaml | |
#增加容器启动参数和挂载证书目录后保存 | |
# - --tls-cert-file=/etc/kubernetes/pki/scheduler.crt | |
# - --tls-private-key-file=/etc/kubernetes/pki/scheduler.key | |
# - --leader-elect=false #多 master 高可用时才需要 | |
# volumeMounts: | |
# - mountPath: /etc/kubernetes/pki | |
# name: k8s-certs | |
# readOnly: true | |
# volumes: | |
# - hostPath: | |
# path: /etc/kubernetes/pki | |
# type: DirectoryOrCreate | |
# name: k8s-certs | |
#修改kube-controller-manager.yaml | |
vi /etc/kubernetes/manifests/kube-controller-manager.yaml | |
#修改容器启动参数后保存 | |
# - --leader-elect=false #多 master 高可用时才需要 | |
#重启kubelet | |
systemctl restart kubelet |
简介
K8S(Kubernetes缩写)是容器编排引擎,用于实现自动化运维管理容器。 核心功能:
- 自动调度:根据容器消耗情况与节点负载情况,自动分配容器到节点上。
- 自动修复:通过健康检查发现节点问题,自动转移到其他节点完成修复。
- 自动扩容收缩:预定义负载指标,自动动态扩容与收缩。
- 服务发现与负载均衡:容器是动态创建,故需要有名字服务和负载均衡。
概念
- Pod(容器组)
- 是调度的基本单元,用于存放一组容器及容器的共享资源。
- 共享资源包括:存储、网络(主机名、IP地址)等。
- Pod 单词是豌豆荚,形象表达了容器组的概念。
- ReplicaSet(复制集):
- 用于确保 Pod 的副本数量和状态稳定性。
- 只有两个信息,副本数和 Pod 模板。
- 一般通过 Deployment 来创建 ReplicaSet。
- Deployment(部署):
- 是对应用部署的抽象,在 ReplicaSet 基础上增加滚动升级和回滚。
- 其定义中比 ReplicaSet 增加了滚动更新策略。
- 当用户修改副本数(Scale)时,会与 ReplicaSet 交互,实现扩容。
- 当用户修改 Pod 模版时就会触发滚动更新。
- 滚动更新时会创建一个新的 ReplicaSet,周期性创建新Pod和删除旧Pod。
- Deployment下,所有Pod是完全一样的,也没有顺序。
- StatefulSet(有状态集):
- StatefulSet 是有状态的 Pod 集合。
- 可确保 Pod 的有序创建和更新。
- 可确保每一个 Pod 有稳定的DNS名称。
- 可为每一个 Pod 创建单独的 PVC。
- 适合部署数据库、队列等有主从节点和持久化存储的服务。
- Service(服务):
- Pod 是动态创建且副本数不定,通过 Service 为其提供稳定的访问方式。
- 其定义中包含具体的外部访问方式及其关联的 Pod 选择器。
- 当关联到多组 Pod 时,负载均衡算法默认是轮询,只支持 4 层负载均衡。
- K8S 内置了DNS 服务器,在集群中可以通过 DNS 来访问服务。
- 可以将 Service 映射到外部服务上,通过 DNS。
- Namespace(命名空间):
- 集群内实现逻辑隔离,在同一个物理集群内实现多个虚拟集群。
- 每个资源必须属于一个Namespace,并且在其内部唯一。
- Label(标签):
- 是附加在资源对象上的键值对。
- 对资源进行命名和分类,便于管理和查找。
- 用于引用和筛选资源,如 service 中用来筛选 Pod。
- Ingress(入口):
- 是集群的外部服务入口,用于将外部请求转发到内部服务上。
- 是 7 层的负载均衡器,是对反向代理的抽象,类似 nginx。
- PersistentVolume(PV,持久卷):
- 是对实际物理存储系统的抽象。
- 是物理集群层面的资源,不属于任何命名空间。
- PV 有多种存储方式,如临时目录、主机目录、共享目录。
- PersistentVolumeClaim(PVC,持久卷声明):
- 是用户对存储请求的抽象。
- PVC 与 PV 的关系类似于接口与实现类的关系。
- 请求信息包含存储大小、访问模式等。
- PVC 会绑定和消耗 PV。
- PVC 必须与 Pod 在同一命名空间下才可以被指定使用。
- DaemonSet
- 确保在每一个节点上都运行一个 Pod。
- 用于部署守护进程,如监控或日志收集器。
- 集群本身的 kube-proxy 就是一个 DaemonSet 部署。
- ConfigMap
- 是一种资源,用于存储 KV 配置信息。
- 可以作为环境变量、命令行参数或挂载到容器中使用。
- Secret
- 是一种资源,用于存储敏感信息,如密码、API 密钥等。
- 可以作为环境变量、命令行参数或挂载到容器中使用。
架构原理
架构图及解析
- K8S集群:一组虚拟机或物理机,运行了 K8S 的集群。
- Master(主节点):负责集群的管理和调度。
- Worker(工作节点):部署用户容器,提供计算资源。
- ETCD:所有资源及状态数据存储的位置。
- APIServer:
- 提供 RESTFul API,是集群控制的入口。
- 接口基本是对资源的增删改查和变化监听。
- Scheduler(调度器):
- 监听 APIServer 变化。
- 负责决定将 Pod 放在哪个节点上运行。
- 会充分考虑集群的拓扑结构、节点负载和亲和性。
- Controller Manager(控制器):
- 管理资源,确保集群处于预期状态。
- 每种资源都有对应的控制器。
- kubelet:
- 在 Worker 上负责 Pod 的全生命周期管理,同时上报状态到 APIServer。
- CRI:容器运行时接口,cri-dockerd是 docker 的CRI实现。
- CNI:容器网络接口,Flannel是其实现。
- CSI:容器存储接口。
- kube-proxy:
- 负责服务转发和负载均衡的实现,对应 service 的功能。
- 以 DaemonSet 方式运行在每个 Worker 上。
- 默认使用 iptables 模式,利用iptables实现转发和四层负载均衡。
- 新版本支持 ipvs,解决iptables线性查找规则的问哦。
- 如果内核版本不够,会降级到 userspace 模式,固定端口进 proxy 进行转发。
- kubectl
- 提供命令行工具,调用 APIserver 接口。
网络模型
- K8S 的网络原则:
- 提供简单一致的网络视图和使用体验,屏蔽宿主机环境和网络拓扑的复杂度。
- K8S 的网络特征:
- 每个 Pod 有一个独立 IP。
- 所有 Pod 通过 IP 直接访问其他 Pod,不管是不是在同一节点上。
- Pod 看自己的 IP 和任意 Pod 或节点看自己的 IP 是一样的。
- Pod 内的容器通过 localhost 访问其他容器。
- K8S 网络模型的实现要求:
- Pod 与任意节点的 Pod 通信无需 NAT。
- Node 与 Pod 相互通信无需 NAT。
- K8S 网络模型的实现原理:
- Pod 内容器共享同个网络命名空间,通过回环虚拟网卡访问内部容器。
- 相同 Node 的 Pod 之间通过 cni0 网桥进行通信。
- 不同 Node 的 Pod 之间通过网络插件进行通信。
- flannel 插件实现了一个覆盖网络,将 TCP数据包装在另外一网络包里进行路由转发和通信。
Pod 原理
- Pod 状态:
- Pending:APIServer 已经创建,Pod 内还有至少一个容器没有创建,包括下载镜像的过程。
- Running:Pod 内所有容器均已创建,至少有一个处于运行中。
- Succeeded:Pod 内所有容器均已成功退出,且不会重启。
- Failed:Pod 内所有容器均已退出,但至少有一个容器退出时状态非 0。
- Unknown:无法取得该 Pod 状态,可能由于网络原因。
- Pod 重启策略:
- Always:默认策略,当容器退出后总是重启。
- OnFailure:退出状态码非 0 时才重启。
- Never:只要退出就不重启。
- Pod 的镜像拉取策略:
- IfNotPresent:默认值,如果本地有镜像,则直接使用,否则从仓库拉取。
- Always:总是重新拉取,每次创建 Pod 都会重新拉取。
- Never:永远不自动拉取,如果 Node 不存在则启动失败。
- Pod 的探针方式:
- httpGet:发 HTTP 请求返回 200-400 为成功
- exec:在容器内执行 shell 命令,根据命令退出状态 0 为健康。
- TCPSocket:与容器的 IP 端口建立TCP 连接,能建立为成功。
- Pod 的探针类型:
- 存活探针(LivenessProbe),用于检测容器健康情况,如果失败 kubelet 会杀掉容器根据容器重启策略决定是否重启。
- 就绪探针(ReadinessProbe),用于检测容器是否准备好接受流量,可以用于确保程序启动后的数据加载,如果失败 service 不会转发请求。
- 启动探针(StartupProbe),适用于初始化时间较长的程序,一旦满足条件后不再执行。存在目的是暂时屏蔽其他探针。
- 直接创建 Pod 的过程:
- 用户通过kubectl或api提交 Pod 信息到 APIServer。
- APIServer验证用户权限,创建 Pod 信息到 ETCD 则返回确认。
- APIServer反馈 ETCD 中Pod的变化,其他组件监听变化。
- 调度器发现了未分配节点的 Pod,为其分配最佳的节点,结果更新到 APIServer。
- Node 上的 kubelet 监听到变化,检查是否存在,不存在则创建。
- 如果需要挂载外部存储,则通过 CSI挂载外部存储。
- 通过 CNI 配置网络,然后启动容器,完成后反馈 APIServer。
- 通过 Deployment 创建Pod 过程:
- kubectl apply 一个 Deployment。
- APIServer验证用户权限,创建Deployment 信息到 ETCD 则 返回确认。
- Deployment 控制器监听到变化会创建ReplicaSet。
- ReplicaSet 控制器监听到变化则会按照其模板创建 Pod。
- 未分配节点的 Pod,后续过程与直接创建 Pod 的过程一样。
- Deployment 创建的Pod,ReplicaSet 控制器会持续关注确保数量。
- Pod 的 容器类型:
- 应用容器:运行业务引用程序,多个时并行启动。
- Init 容器:可以有多个,在应用容器启动前串行启动。
- Pause 容器:在 pod 内第一个启动,用于设置网络,生命周期与 Pod 相同。
- SideCar 容器:只是一种设计模式,把业务无关的功能剥离出来通过辅助容器实现。
- Pod 的亲和性调度:
- 确保 Pod 运行在特定类型的节点上,如 SSD存储节点或 GPU 节点。
命令行
代码语言:javascript
复制
kubectl --help | |
kubectl version | |
kubectl api-resources | |
kubeclt cluster-info | |
kubectl create -f xx.yaml | |
kubectl apply -f xx.yaml | |
kubectl get nodes | |
kubectl get cs | |
kubectl get all -A | |
kubectl get pod -A -w -o wide | |
kubectl get all -n kubernetes-dashboard | |
kubectl get svc -n kubernetes-dashboard | |
kubectl get deploy nginx -o=yaml --export > nginx.yaml | |
kubectl describe deploy kubernetes-dashboard -n kubernetes-dashboard |
helm
helm是一个包管理工具,可以用来管理kubernetes应用。 helm是舵轮的意思,kubernetes 是舵手。 文档:https://helm.sh/zh/docs/
helm 安装
代码语言:javascript
复制
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | |
chmod 700 get_helm.sh | |
./get_helm.sh |