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 <<EOF | sudo tee  /etc/hosts
192.168.36.213  k8s-master
192.168.36.141  k8s-node1
192.168.36.188  k8s-node2
EOF

# 互相 ping 通
www@k8s-master:~$ ping 192.168.36.188
PING 192.168.36.188 (192.168.36.188) 56(84) bytes of data.
64 bytes from 192.168.36.188: icmp_seq=1 ttl=64 time=0.511 ms
64 bytes from 192.168.36.188: icmp_seq=2 ttl=64 time=0.323 ms
# 禁用交换分区
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 <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

www@k8s-master:~$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
www@k8s-master:~$ sudo sysctl --system

安装 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 <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF 
  • 更新 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   <none>                 13s     v1.23.1
k8s-node2    NotReady   <none>                 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    <none>                 17h   v1.23.1
k8s-node2    Ready    <none>                 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       <none>        443/TCP        18h
service/nginx        NodePort    10.255.117.143   <none>        80:32224/TCP   107s
  • 在外网中以任一 node(192.168.36.141192.168.36.188) 节点加上对外暴露端口 32224访问可以看到如下结果:
    image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容