1 创建集群前检查
kubernetes 基本组件有
kubernetes 基本组件.png
① 确保集群中的节点是 Linux 系统
② 确保每个节点上 MAC 地址和 product_uuid 的唯一性
● 使用命令 ip link
或 ifconfig -a
来获取网络接口的 MAC 地址
● 使用 sudo cat /sys/class/dmi/id/product_uuid
命令对 product_uuid
校验
③ 确保所有机器的网络彼此均能相互连接(公网和内网都可以)
④ 允许 iptables 检查桥接流量
显式加载模块 modprobe br_netfilter,可执行 sudo modprobe br_netfilter
,Linux 节点上的 iptables 能够正确地查看桥接流量,确保在 sysctl 配置中将 net.bridge.bridge-nf-call-iptables
设置为 1
$cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
$cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$sudo sysctl --system
⑤ 检查所需端口
控制平面节点:
协议 | 方向 | 端口范围 | 作用 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 6443 | Kubernetes API 服务器 | 所有组件 |
TCP | 入站 | 2379-2380 | etcd 服务器客户端 API | kube-apiserver, etcd |
TCP | 入站 | 10250 | Kubelet API | kubelet 自身、控制平面组件 |
TCP | 入站 | 10251 | kube-scheduler | kube-scheduler 自身 |
TCP | 入站 | 10252 | kube-controller-manager | kube-controller-manager 自身 |
工作节点:
协议 | 方向 | 端口范围 | 作用 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 10250 | Kubelet API | kubelet 自身、控制平面组件 |
TCP | 入站 | 30000-32767 | NodePort 服务† | 所有组件 |
2 安装 Kubeadm
如下图所示,Kubeadm 在完整 Kubernetes 堆栈中的位置。
Kubeadm 在完整 Kubernetes 堆栈中的位置.pngkubeadm:用来初始化集群的指令。
kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl:用来与集群通信的命令行工具。
基于 Debian 的发行版安装 kubelet、kubeadm 和 kubectl
### 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
$sudo apt-get update
$sudo apt-get install -y apt-transport-https ca-certificates curl
### 下载 Google Cloud 公开签名秘钥
$sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
### 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本
$sudo apt-get update
$sudo apt-get install -y kubelet kubeadm kubectl
$sudo apt-mark hold kubelet kubeadm kubectl
3 使用 Kubeadm 安装基本集群
3.1 初始化控制平面
将单个控制平面 kubeadm 集群升级成高可用, 可以指定 --control-plane-endpoint "xxx:6443"
为所有控制平面节点设置共享端点,其中端点 xxx 可以是负载均衡器的 DNS 名称或 IP 地址。
$kubeadm init --control-plane-endpoint=cluster-endpoint:6443 \
--apiserver-advertise-address=10.163.10.6 \
--pod-network-cidr=192.168.0.0/16 \
--upload-certs
# --control-plane-endpoint 可用于为所有控制平面节点设置共享端点, 允许 IP 地址和可以映射到 IP 地址的 DNS 名称,例如 192.168.0.102 cluster-endpoint
# --apiserver-advertise-address 可用于为控制平面节点的 API server 设置广播地址
# --pod-network-cidr 指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。
# 将控制平面证书上传到 kubeadm-certs Secret
# 默认情况下,出于安全原因,你的集群不会在控制平面节点上调度 Pod。 如果你希望能够在控制平面节点上调度 Pod, 例如用于开发的单机 Kubernetes 集群
$kubectl taint nodes --all node-role.kubernetes.io/master-
node "test-01" untainted
taint "node-role.kubernetes.io/master:" not found
taint "node-role.kubernetes.io/master:" not found
3.2 安装容器运行时
参考容器运行时
3.3 安装 Pod 网络附加组件
说明:必须部署一个基于 Pod 网络插件的容器网络接口 (CNI),以便 Pod 可以相互通信。 在安装网络之前,集群 DNS (CoreDNS) 将不会启动。
注意:
① Pod 网络不得与任何主机网络重叠。如果发现网络插件的首选 Pod 网络与某些主机网络之间存在冲突, 则应考虑使用一个合适的 CIDR 块来代替, 然后在执行 kubeadm init 时使用--pod-network-cidr
参数并在你的网络插件的 YAML 中替换它。
② 默认情况下kubeadm
将集群设置为使用和强制使用 RBAC(基于角色的访问控制)。 确保 Pod 网络插件支持 RBAC,以及用于部署它的 manifests 也是如此。
安装网络插件,可以参考网络插件、kubelet 命令
### 类型 1:cni 网络插件
# CNI 插件可执行文件位于 --cni-bin-dir(默认是 /opt/cni/bin)下, CNI 插件配置位于 --cni-conf-dir(默认是 /etc/cni/net.d)
$kubelet --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d
# 查看 kubelet 参数详情
$ps -ef | grep kubelet
# 重新启动 kubelet 以使更改生效
$systemctl daemon-reload
$systemctl restart kubelet
$vi /opt/cni/net.d/10-flannel.conflist
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
### 类型 2:kubenet 网络插件
# CNI bridge,lo 和 host-local 插件位于 /opt/cni/bin 或 cni-bin-dir 中
$kubelet --network-plugin=kubenet --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d
3.5 加入节点
# 在 master 控制平面节点获取 token
$kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
8ewj1p.9r9hcjoqgajrj4gi 23h 2018-06-12T02:51:28Z authentication, The default bootstrap system:
signing token generated by bootstrappers:
'kubeadm init'. kubeadm:
default-node-token
# 如果 list 没有 token,即默认情况下,令牌会在24小时后过期。
$kubeadm token create
5didvk.d09sbcov8ph2amjw
# 自动生成带 token 的 join 命令:
$kubeadm token create --print-join-command
kubeadm join --token 5didvk.d09sbcov8ph2amjw 192.168.0.102:6443 --discovery-token-ca-cert-hash sha256:8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78
# 在 master 控制平面节点获取 hash
$openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78
# 添加当前节点的步骤:
# 1.拷贝 docker 配置到 node-1
# 2.首先 SSH 到机器, 成为 root (例如 sudo su -),然后执行 kubeadm join 添加当前节点
# 3.添加节点 kubeadm join
$scp /etc/docker/daemon.json 192.168.0.102:/etc/docker
$ssh node-1
$sudo su
kubeadm join --token 5didvk.d09sbcov8ph2amjw 192.168.0.102:6443 --discovery-token-ca-cert-hash sha256:8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78
[preflight] Running pre-flight checks
... (log output of join workflow) ...
Node join complete:
* Certificate signing request sent to control-plane and response
received.
* Kubelet informed of new secure connection details.
Run 'kubectl get nodes' on control-plane to see this machine join.
# 在 master 查询 node
$kubectl get nodes
3.4 清除节点和控制平面
### 方式 1:删除集群对本地的引用
$kubectl config delete-cluster
# 配置不把 Pod 调度到节点 node-1 $kubectl cordon node-1
### 方式 2:彻底还原节点 node-1
# 使用适当的凭证与控制平面节点通信
$kubectl drain node-1 --delete-emptydir-data --force --ignore-daemonsets
# 在删除节点之前,请重置 kubeadm 安装的状态
$kubeadm reset
# 重置过程不会重置或清除 iptables 规则或 IPVS 表。如果希望重置 iptables,则必须手动进行
$iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
# 重置 IPVS 表
$ipvsadm -C
# 删除节点 node-1
$kubectl delete node node-1
# 清理控制平面
$kubeadm reset
网友评论