Debian11最小化部署k8s集群

查看安装 kubeadm-准备工作 对 k8s 安装的基本要求:

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
  • 2 CPU 核或更多
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
  • 开启机器上的某些端口。请参见这里 了解更多详细信息。
  • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。

部署准备工作

整个部署环境全在virtualbox中实现
部署最小化 K8S 集群:master + node1 + node2

image.png

图中是预先准备好的 3 台虚拟机,Debian安装参考Debian11安装简述。
虚拟机基本配置是:2G内存+2核CPU+20G磁盘空间。

设置k8s环境准备条件(所有机器)

3台主机IP分别为 192.168.36.213192.168.36.141192.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 包索引并安装使用 Kubernetes apt 仓库所需要的包:
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 状态:当 STATUSRunning 即表示创建完成
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.141192.168.36.188) 节点加上对外暴露端口 32224访问可以看到如下结果:
    image.png

至此,一个简单的 k8s 集群系统安装、测试完成。

你可能感兴趣的:(Debian11最小化部署k8s集群)