kubadm官网:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/
Kubernetes的独立部署工具:kubeadm
让用户两条命令完成一个Kubernets集群的部署:
# 创建一个Master节点
$ kubeadm init
# 将一个Node节点加入到当前集群中
$ kubeadm join <Master节点的IP和端口>
Kubernetes集群组网图参考:
这个 Kubernetes 集群就只有两台主机,一台是 Master 节点,另一台是 Worker 节点。
我的Kubernetes集群主机配置如下:
ip | cpu内存 | 磁盘(G) | 角色 |
192.168.184.129 | 2c4g | 50 | Master |
192.168.184.130 | 2c2g | 50 | Worker |
192.168.184.136 | 2c2g | 30 | Console |
master和worker上都要操作
docker安装部分内容参考:https://juejin.cn/post/7235574844435349541
sudo vi /etc/hostname
Master节点:
Worker节点:
使用systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
为了让 Kubernetes 能够检查、转发网络流量,你需要修改 iptables 的配置,启用“br_netfilter”模块
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
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF
sudo sysctl --system
/etc/fstab
关闭 Linux 的 swap 分区,提升 Kubernetes 的性能:
sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
master和worker上都要安装kubeadm
sudo apt install -y apt-transport-https ca-certificates curl
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt update
sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00
kubeadm version
kubectl version --client
避免意外升级导致版本错误
sudo apt-mark hold kubeadm kubelet kubectl
kubeadm config images list --kubernetes-version v1.23.3
repo=registry.aliyuncs.com/google_containers
for name in `kubeadm config images list --kubernetes-version v1.23.3`; do
src_name=${name#k8s.gcr.io/}
src_name=${src_name#coredns/}
docker pull $repo/$src_name
docker tag $repo/$src_name $name
docker rmi $repo/$src_name
done
kubeadm init \
--apiserver-advertise-address=192.168.184.129 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.10.0.0/16
我已经提前拉下来镜像,所以使用以下命令初始化集群
:
sudo kubeadm init \
--pod-network-cidr=10.10.0.0/16 \
--apiserver-advertise-address=192.168.184.129 \
--kubernetes-version=v1.23.3
--pod-network-cidr
,设置集群里 Pod 的 IP 地址段。--apiserver-advertise-address
,设置 apiserver 的 IP 地址,即Master的ip地址。--kubernetes-version
,指定 Kubernetes 的版本号。执行完根据提示执行命令拷贝kubectl配置,命令行操作需要
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
另外有一个提示节点加入集群
的命令(重要
):
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.184.129:6443 --token 09mf6a.jkzazzdbu3ypkebk \
--discovery-token-ca-cert-hash sha256:50564907664b46361b122cbcbb19fabd52bdd303c4539a61ce77d8dbac85d3d1
查看Kubernetes 的版本和集群的节点状态:
kubectl version
kubectl get node
你会注意到 Master 节点的状态是“NotReady”,这是由于还缺少网络插件,集群的内部网络还没有正常运作。
kubeadm init后的kubernetes配置路径:/etc/kubernetes
Kubernetes 定义了 CNI 标准,有很多网络插件,这里我选择最常用的 Flannel,可以在它的 GitHub 仓库里(https://github.com/flannel-io/flannel/)找到相关文档。
需要修改文件里的“net-conf.json”字段,把 Network 改成刚才 kubeadm 的参数 --pod-network-cidr 设置的地址段。
https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
在master节点就可以查看到
kubectl get node
Woker主机上执行初始化Kubernetes时,在Master上的提示命令
sudo kubeadm join 192.168.184.129:6443 --token 09mf6a.jkzazzdbu3ypkebk \
--discovery-token-ca-cert-hash sha256:50564907664b46361b122cbcbb19fabd52bdd303c4539a61ce77d8dbac85d3d1
它会连接 Master 节点,然后拉取镜像,安装网络插件,最后把节点加入集群。
稍等片刻,就可以在Master节点上看到两个节点是Ready
状态了。
如果在初始化集群时没有记住,可以使用
kubeadm token create --print-join-command
显示加入方式。
mkdir ~/.kube
创建目录scp `which kubectl` lianhaifeng@192.168.184.136:~/
scp ~/.kube/config lianhaifeng@192.168.184.136:~/.kube
也可以直接以Master作为Console主机用于操作Kubenetes集群,不过一般不建议这么做
现在让我们在Master或Console上用 kubectl run ,运行 Nginx 来测试一下:
kubectl run ngx --image=nginx:alpine
kubectl get pod -o wide
会看到 Pod 运行在 Worker 节点上,IP 地址是“10.10.1.2”,表明我们的 Kubernetes 集群部署成功。
kubeadm init
,安装Worker节点需要使用命令kubeadm join
,还要部署Flannel
等网络插件才能让集群正常工作。