在 ubuntu 虚拟机安装 k8s 集群
前置条件:
设置网络代理
网络代理 APP 安装在宿主机。
本文所使用的代理端口为 7890,如果你使用的是其它端口,在参考本文时,注意将 7890 进行替换。
假如你使用的网络代理 APP 是 Clash For Windows,打开 Allow LAN,这将允许虚拟机使用该网络代理。
如果你使用的是某小飞机,那么将 HTTP 代理监听地址更改为 0.0.0.0 即可
todoit.tech 是我的 k8s 集群所使用的域名,将它加入到忽略名单,不走代理。
bypass:
- 127.0.0.1
- 192.168.0.0/16
- 10.0.0.0/8
- 172.16.0.0/12
- 100.64.0.0/10
- 17.0.0.0/8
- localhost
- "*.local"
- "*.todoit.tech"
- 169.254.0.0/16
- 224.0.0.0/4
- 240.0.0.0/4
进入虚拟机,修改 /etc/environment 文件,添加如下设置
# vi /etc/environment
http_proxy="http://192.168.32.2:7890"
https_proxy="http://192.168.32.2:7890"
no_proxy="192.168.32.64,192.168.32.0/24,10.211.55.0/24,.todoit.tech,.svc,.svc.cluster.local,.cluster.local,10.244.0.0/16,10.96.0.0/12,127.0.0.1,localhost,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8"
192.168.32.2 是 Parallels 为宿主机分配的 IP 地址,虚拟机通过宿主机的代理访问外网。
退出 ssh, 重新进来
# 虚拟机
exit
# 宿主机
ssh [email protected]
安装 Docker
登录 root 用户
设置 Docker 仓库
根据 Docker 官方指南Install using the repository进行操作。
- 更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库:
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
- 添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 使用以下命令设置稳定存储库。
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装 Docker 引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo docker version
配置 Docker 守护程序
使用 systemd 来管理容器的 cgroup
sudo mkdir -p /etc/docker
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
重新启动 Docker 并在开机时启用:
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
配置 Docker 网络代理
根据官方 HTTP/HTTPS Proxy 的指引来配置网络代理。
- 为 docker 服务创建一个 systemd 目录
sudo mkdir -p /etc/systemd/system/docker.service.d
- 创建一个名为 /etc/systemd/system/docker.service.d/http-proxy.conf 的文件,添加 HTTP_PROXY 等环境变量
cat <<EOF | sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.32.2:7890"
Environment="HTTPS_PROXY=http://192.168.32.2:7890"
Environment="NO_PROXY=.svc,.svc.cluster.local,.cluster.local,.todoit.tech,10.244.0.0/16,10.96.0.0/12,127.0.0.1,localhost,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8"
EOF
- 刷新更改并重新启动 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
安装 kubeadm
禁用交换分区
swapoff -a
vi /etc/fstab
# remove the line with swap keyword
允许 iptables 检查桥接流量
依据官方文档允许 iptables 检查桥接流量,作如下设置:
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
安装 kubelet, kubeadm, kubectl
按照官方文档安装 kubeadm、kubelet 和 kubectl来。
设置 kubeadm 软件源:
sudo apt-get update
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
安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
sudo apt-get update
sudo apt-get install -y kubelet=1.23.15-00 kubeadm=1.23.15-00 kubectl=1.23.15-00
sudo apt-mark hold kubelet kubeadm kubectl
使用 kubeadm 创建集群
依据官方操作指南,有如下主要步骤。
安装 Master 节点
sudo kubeadm init \
--kubernetes-version v1.23.15 \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.32.32
--pod-network-cidr
的值是网络插件 flannel 要求的,我们稍后会安装它,--apiserver-advertise-address
是 master 节点的 ip 地址,是静态的。
如果无法配置网络代理,可增加 --image-repository registry.aliyuncs.com/google_containers 参数,使用阿里云镜像。
安装完成后,得到如下提示信息
# 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.32.32:6443 --token zs106v.ri099g8v6laeg7pb \
# --discovery-token-ca-cert-hash sha256:c4b086f09123e0d55b82b119a40a377370e2d21307705ba5bef6729e3371e03d
要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是 kubeadm init 输出的一部分:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
或者,如果你是 root 用户,则可以运行:
export KUBECONFIG=/etc/kubernetes/admin.conf
由于我们是 root 用户登录,因此编辑 ~/.bashrc 文件,添加如上代码,然后执行
source ~/.bashrc
从宿主机控制集群
# 宿主机
mkdir -p $HOME/.kube
scp [email protected]:/etc/kubernetes/admin.conf $HOME/.kube/config
运行如下命令,检查是否成功
# 宿主机
kubectl cluster-info
# Kubernetes control plane is running at https://192.168.32.32:6443
# CoreDNS is running at https://192.168.32.32:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
# To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
宿主机可以使用 brew install kubernetes-cli 来安装 kubectl 命令行工具
安装 Flannel 网络插件
貌似 calico 和 M1 八字不合
# git地址:https://github.com/coreos/flannel#flannel
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
查看网络插件组件是否就绪
kubectl get pod -n kube-flannel
安装 Worker 节点
Worker 节点是你的工作负载(容器和 Pod 等)运行的地方。要将 Worker 节点添加到集群,请对每台虚拟机执行以下操作:
- 安装 Docker
- 安装 kubeadm
- 执行部署 Master 节点时生成的 kubeadm join 指令:
kubeadm join 192.168.32.32:6443 \
--token zs106v.ri099g8v6laeg7pb \
--discovery-token-ca-cert-hash \
sha256:c4b086f09123e0d55b82b119a40a377370e2d21307705ba5bef6729e3371e03d
token 具有时效性,如果 token 过期,可以在 Master 节点上重新生成
# 在 Master 节点执行,然后将结果拷贝到 Worker 节点执行
kubeadm token create --print-join-command
删除 Worker 节点
如果希望删除 Worker 节点,可以在 Master 节点上执行如下命令
kubectl get nodes
kubectl drain <node-name> --delete-local-data --force --ignore-daemonsets
kubectl delete node <node-name>
查看节点就绪状态
# 在宿主机或 Master 节点执行
kubectl get nodes -w
# NAME STATUS ROLES AGE VERSION
# k8s-master Ready control-plane,master 7d22h v1.23.15
# k8s-node-1 Ready <none> 7d22h v1.23.15
# k8s-node-2 Ready <none> 7d22h v1.23.15
检查 Pod 网络连通性
kubectl run -i -t busybox --image=busybox -- sh
# kubectl attach busybox -c busybox -i -t
# docker run -it --rm busybox
ping 一下百度,如下即表示成功