查看安装 kubeadm-准备工作 对 k8s 安装的基本要求:
- 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
- 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
- 2 CPU 核或更多
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
- 开启机器上的某些端口。请参见这里 了解更多详细信息。
- 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。
部署准备工作
(整个部署环境全在virtualbox中实现)
部署最小化 K8S 集群:master + node1 + node2
图中是预先准备好的 3 台虚拟机,Debian安装参考Debian11安装简述。
虚拟机基本配置是:2G内存+2核CPU+20G磁盘空间。
设置k8s环境准备条件(所有机器)
3台主机IP分别为 192.168.36.213
、192.168.36.141
、192.168.36.188
、,将起配置到 文件中,保证互相合一通:
以下使用 master 节点进行演示查看,其他节点操作均一致
基础信息配置
# 修改主机名称,保证节点主机名不重复
www@debian:~$ sudo hostnamectl set-hostname k8s-master
www@debian:~$ hostname # 查看修改结果
k8s-master
# 配置 hosts 文件
www@k8s-master:~$ cat <
# 禁用交换分区
www@k8s-master:~$ sudo swapoff -a
# 永久禁用,打开/etc/fstab注释掉swap那一行。
www@k8s-master:~$ sed -i 's/.*swap.*/#&/' /etc/fstab
# 设置系统时区为中国/上海(同步系统时区)
www@k8s-master:~$ sudo timedatectl set-timezone Asia/Shanghai
允许 iptables 检查桥接流量
确保 br_netfilter
模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter
来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter
。
为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl
配置中将 net.bridge.bridge-nf-call-iptables
设置为 1
:
www@k8s-master:~$ cat <
安装 Docker
参见 Debian11安装docker
安装 kubeadm、kubelet 和 kubectl
参考 安装-kubeadm-kubelet-和-kubectl
- 更新
apt
包索引并安装使用 Kubernetesapt
仓库所需要的包:
www@k8s-master:~$ sudo apt-get update
www@k8s-master:~$ sudo apt-get install -y apt-transport-https ca-certificates curl
- 下载 kubernetes 签名秘钥:
由于官方 k8s 源在 google,国内无法访问,这里使用阿里云yum源
www@k8s-master:~$ curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
- 添加 Kubernetes
apt
仓库:
www@k8s-master:~$ cat <
- 更新
apt
包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
www@k8s-master:~$ sudo apt-get update
www@k8s-master:~$ sudo apt-get install -y kubelet kubeadm kubectl
防止版本误差太大出问题,锁定版本
www@k8s-master:~$ sudo apt-mark hold kubelet kubeadm kubectl
添加开机启动
www@k8s-master:~$ sudo systemctl enable kubelet.service
www@k8s-master:~$ sudo systemctl start kubelet.service
---------------以上使用 master 节点进行演示查看,其他节点操作均一致--------------------
部署 kubernetes Master
在 master(192.168.36.213)节点上执行:
kubeadm init
命令参考
- --kubernetes-version — 制定当前 kubernetes 版本
- --image-repository — 选择用于拉取控制平面镜像的容器仓库
- apiserver-advertise-address — API 服务器所公布的其正在监听的 IP 地址,即 Master 主机地址
- --service-cidr — 为服务的虚拟 IP 地址另外指定 IP 地址段,默认值:"10.96.0.0/12"
- --pod-network-cidr — 指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。
www@k8s-master:~$ sudo kubeadm init \
--kubernetes-version=1.23.1 \
--image-repository registry.aliyuncs.com/google_containers \
--apiserver-advertise-address=192.168.36.213 \
--service-cidr=10.245.0.0/12 \
--pod-network-cidr=10.244.0.0/16
上面安装完后,会提示你输入如下命令,按顺序执行即可。
Your Kubernetes control-plane has initialized successfully!
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.36.213:6443 --token vhglgq.vunh0rsxz8nlzcd1 \
--discovery-token-ca-cert-hash sha256:e0f8afa923d79d6da38394b0e9fbdb70cd9c67d86df39487146d406bb023a42b
在 ndoe 节点分别执行这个命令:
www@k8s-master:~$ sudo kubeadm join 192.168.36.213:6443 --token vhglgq.vunh0rsxz8nlzcd1 \
--discovery-token-ca-cert-hash sha256:e0f8afa923d79d6da38394b0e9fbdb70cd9c67d86df39487146d406bb023a42b
默认 token
有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建 token
,操作如下:
www@k8s-master:~$ sudo kubeadm token create --print-join-command
上述操作成功之后回到 Master 节点,运行 kubectl get nodes
命令查看:
www@k8s-master:~$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 4m56s v1.23.1
k8s-node1 NotReady 13s v1.23.1
k8s-node2 NotReady 21s v1.23.1
安装 CNI 网络插件
此时,虽然 Maste 节点可以检测到 node 节点,但 STATUS 都还是 NotReady 状态,这里需要看装 CNI节点来实现网络访问。Kubernetes 的网络模型选择:
- 安装 calico 插件
# 这里选择的是 calico 插件
www@debian:~$ sudo kubectl apply -f https://docs.projectcalico.org/v3.20/manifests/calico.yaml
- 验证结果
www@debian:~$ sudo kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-7c8984549d-pt78g 1/1 Running 0 24m
kube-system calico-node-jkbvn 1/1 Running 0 24m
kube-system calico-node-txj79 1/1 Running 0 24m
kube-system calico-node-vm8wm 1/1 Running 0 24m
kube-system coredns-6d8c4cb4d-7bz8d 1/1 Running 0 17h
kube-system coredns-6d8c4cb4d-w2qbx 1/1 Running 0 17h
kube-system etcd-k8s-master 1/1 Running 2 (13h ago) 17h
kube-system kube-apiserver-k8s-master 1/1 Running 2 (13h ago) 17h
kube-system kube-controller-manager-k8s-master 1/1 Running 2 (13h ago) 17h
kube-system kube-proxy-5brbs 1/1 Running 1 (13h ago) 17h
kube-system kube-proxy-dmg62 1/1 Running 1 (13h ago) 17h
kube-system kube-proxy-rc6ww 1/1 Running 1 (13h ago) 17h
kube-system kube-scheduler-k8s-master 1/1 Running 2 (13h ago) 17h
- 再次运行
kubectl get nodes
命令查看节点状态:
www@k8s-master:~$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 17h v1.23.1
k8s-node1 Ready 17h v1.23.1
k8s-node2 Ready 17h v1.23.1
各个节点状态已就绪
测试 kubernetes 集群
- 拉取一个nginx镜像,并创建 nginx Pod
www@k8s-master:~$ sudo kubectl create deployment nginx --image=nginx
- 查看 nginx Pod 状态:当 STATUS 为
Running
即表示创建完成
www@k8s-master:~$ sudo kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-85b98978db-gszf4 0/1 ContainerCreating 0 37s
www@k8s-master:~$ sudo kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-85b98978db-gszf4 1/1 Running 0 4m28s
- 对外暴露 nginx 端口
www@k8s-master:~$ sudo kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
- 查看对外暴露端口状态
www@k8s-master:~$ sudo kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-85b98978db-gszf4 1/1 Running 0 8m55s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.240.0.1 443/TCP 18h
service/nginx NodePort 10.255.117.143 80:32224/TCP 107s
- 在外网中以任一 node(
192.168.36.141
、192.168.36.188
) 节点加上对外暴露端口32224
访问可以看到如下结果:
至此,一个简单的 k8s 集群系统安装、测试完成。