在 ubuntu 虚拟机安装 k8s 集群

前置条件:

设置网络代理

网络代理 APP 安装在宿主机。

本文所使用的代理端口为 7890,如果你使用的是其它端口,在参考本文时,注意将 7890 进行替换。

假如你使用的网络代理 APP 是 Clash For Windows,打开 Allow LAN,这将允许虚拟机使用该网络代理。

k8s-2023-01-12-12-01-19

如果你使用的是某小飞机,那么将 HTTP 代理监听地址更改为 0.0.0.0 即可

todoit.tech 是我的 k8s 集群所使用的域名,将它加入到忽略名单,不走代理。

k8s-2023-01-12-12-02-33

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 repositoryopen in new window进行操作。

  1. 更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库:
sudo apt-get update

sudo apt-get install \
  apt-transport-https \
  ca-certificates \
  curl \
  gnupg \
  lsb-release
  1. 添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 使用以下命令设置稳定存储库。
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 Proxyopen in new window 的指引来配置网络代理。

  1. 为 docker 服务创建一个 systemd 目录
sudo mkdir -p /etc/systemd/system/docker.service.d
  1. 创建一个名为 /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
  1. 刷新更改并重新启动 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

安装 kubeadm

禁用交换分区

swapoff -a
vi /etc/fstab
# remove the line with swap keyword

k8s-2022-06-22-22-47-20

允许 iptables 检查桥接流量

依据官方文档允许 iptables 检查桥接流量open in new window,作如下设置:

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 和 kubectlopen in new window来。

设置 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 创建集群

依据官方操作指南open in new window,有如下主要步骤。

安装 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

k8s-2021-10-15-18-24-44

安装 Worker 节点

Worker 节点是你的工作负载(容器和 Pod 等)运行的地方。要将 Worker 节点添加到集群,请对每台虚拟机执行以下操作:

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 一下百度,如下即表示成功

k8s-2021-10-15-18-22-04

上次更新: