使用kubeadm在Ubuntu 22.04上构建Kubernetes环境
你好。
我是Class Act公司基础设施业务部的大塚。
在本篇文章中,我們將使用kubeadm在ubuntu22.04上建立Kubernetes環境。
我們將使用一台主控節點和一台工作節點來構建這個環境。
为什么要用kubeadm构建Kubernetes环境呢?
今まで散々、microk8sやRancher、GKE等を使用してKubernetes環境を構築してきましたが、これらの環境だとKubernetesのnetworkやcertificate、ETCD周りの検証がしにくいなという問題にぶつかりました。
私は近いうちにCKA(Certified Kubernetes Administrator)と呼ばれるKuberenetesの資格を取得しようと考えております。
そのためにUdemyの以下の動画(界隈では鉄板の教材であるみたい)を使用してKubernetesを勉強したりいじったりしているのですが、上記であげたETCDなどの検証がしにくいようなイメージがあります。
誤認であれば恐縮なのですが、microk8sやGKEは便利であるがゆえにブラックボックスのようになっている部分が多いように感じ、その部分が勉強をしているときに気持ち悪かったりもやもやしたり、色々調べまわったりして疲れるなと。
另外,由于似乎kubeadm在CKA的考试范围内,我们不能回避它。因此,我们决定重新搭建Kubernetes环境。
词汇
kubeadm的意思是“Kubernetes Administration”,它是一个用于快速部署和管理Kubernetes集群的工具。
Kubeadmは、Kubernetesクラスタを作成するためのベストプラクティスの「ファストパス」としてkubeadm initとkubeadm joinを提供するために構築されたツールである。
kubeadmは、最小限の実行可能なクラスタを立ち上げて実行するために必要なアクションを実行します。設計上、マシンのプロビジョニングではなく、ブートストラップのみに関心があります。同様に、Kubernetes Dashboard、監視ソリューション、クラウド固有のアドオンなど、さまざまな便利なアドオンをインストールすることも、対象外です。
その代わり、kubeadmの上に、より高レベルでよりカスタマイズされたツールが構築されることを期待しています。理想的には、すべてのデプロイの基礎としてkubeadmを使用することで、適合するクラスタを簡単に作成することができます。
结束
当使用Here Document时,
通过以下描述可以指定结束字符为”EOF”,
并且会在输入”EOF”之前持续进行文件输入。
cat > sample.txt << EOF
> text1
> text2
> text3
> EOF
容器运行时
这似乎是从Docker派生出来的软件。
在Docker内部使用的那个东西吗?
这本书中有这样的记载。
参考于构建时的网站
如果按照以下网站上的方法进行操作,我认为应该没有问题。至少在我的环境中没有问题。
不过,还可能有些事情没有写出来,所以我想把它作为备忘录记录下来。。。
硬件规格
我会将其作为参考记下来。
k8s控制节点
k8s-worker01:Kubernetes工作节点01
构建
master/worker全ノードで実行すること
まず、名前解決できるように/etc/hostsに対してデータを入れ込みます。
以下はmasterノードのhostsファイルになり、★がついているところが追記したデータとなります。
worker02や03は今後追加するものなのでここでは気になさらないでください。
127.0.0.1 localhost
127.0.1.1 k8s-master
192.168.2.30 k8s-master ★
192.168.2.31 k8s-worker01 ★
192.168.2.32 k8s-worker02 ★
192.168.2.33 k8s-worker03 ★
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
为了禁用 swap,请执行以下命令。
root@k8s-master:~# swapoff -a
root@k8s-master:~# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
应该加载内核模块
root@k8s-master:~# tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
root@k8s-master:~# modprobe overlay
root@k8s-master:~# modprobe br_netfilter
在Kubernetes的配置中设置内核参数
(当出现类似”>”的内容时,只需输入EOF并按下回车键即可,应该没有问题。)
root@k8s-master:~# tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
我会将上述更改反映出来。虽然会突然输出,但你不用担心啊。
root@k8s-master:~# sysctl --system
安装并启动 containerd。
root@k8s-master:~# apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
root@k8s-master:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
root@k8s-master:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
root@k8s-master:~# apt update
root@k8s-master:~# apt install -y containerd.io
root@k8s-master:~# containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
root@k8s-master:~# sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
root@k8s-master:~# systemctl restart containerd
root@k8s-master:~# systemctl enable containerd
安装与Kubernetes相关的命令等。
root@k8s-master:~# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/kubernetes-xenial.gpg
root@k8s-master:~# apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
root@k8s-master:~# apt update
root@k8s-master:~# apt install -y kubelet kubeadm kubectl
root@k8s-master:~# apt-mark hold kubelet kubeadm kubectl
无论是主节点还是工作节点,都在每个节点上运行此部分。
使用master执行01。
执行以下命令来初始化Kubernetes集群。
输出较长,省略了其中一些内容,但保留了必要的部分。
另外,请将这些输出复制保存好。
此外,命令中的endpoint选项取决于个人的环境,请小心操作。基本上只需指定主节点作为master即可。
root@k8s-master:~# kubeadm init --control-plane-endpoint=k8s-master
~ 中略 ~
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/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join k8s-master:6443 --token pg46jl.pvynngmtqsrukf6l \
--discovery-token-ca-cert-hash sha256:0497a12ab9c4ff1eb3c21bf6f92d2346c3645a00f54c746a5000f1ffe9a107fc \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join k8s-master:6443 --token pg46jl.pvynngmtqsrukf6l \
--discovery-token-ca-cert-hash sha256:0497a12ab9c4ff1eb3c21bf6f92d2346c3645a00f54c746a5000f1ffe9a107fc
如果成功初始化,执行以下命令。
如果不执行此命令,在Kubernetes集群初始化完成后尝试执行「太好了!试试看敲一下kubectl get pod命令!」时,会收到tcp连接被拒绝的错误。(失败一次)
root@k8s-master:~# mkdir -p $HOME/.kube
root@k8s-master:~# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@k8s-master:~# chown $(id -u):$(id -g) $HOME/.kube/config
root@k8s-master:~# kubectl cluster-info
Kubernetes control plane is running at https://k8s-master:6443
CoreDNS is running at https://k8s-master:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
我只需要一种选择来用中文重新表达这个句子:
我试着运行” kubectl get node “和” get pod “命令。DNS pod 目前处于 pending 状态,但目前没有问题。稍后我们将部署 Calico 并开始运行它。(也许在此时刻,它会认为 Kubernetes 内部网络尚未就绪而不会启动运行?)节点也处于 NotReady 状态,但目前不需要担心。
root@k8s-master:~# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 6m11s v1.27.2
root@k8s-master:~# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5d78c9869d-sswnk 0/1 Pending 0 6m11s
kube-system coredns-5d78c9869d-zmjp6 0/1 Pending 0 6m11s
kube-system etcd-k8s-master 1/1 Running 0 6m18s
kube-system kube-apiserver-k8s-master 1/1 Running 0 6m15s
kube-system kube-controller-manager-k8s-master 1/1 Running 0 6m20s
kube-system kube-proxy-jkfzg 1/1 Running 0 6m11s
kube-system kube-scheduler-k8s-master 1/1 Running 0 6m22s
以工作人员的身份执行
我会执行”kubeadm join”命令,它实际上是通过”kubeadm init”输出的。由于每个人的环境不同,请复制并使用输出的命令。如果您曾使用过microk8s,您可能会对在主节点上运行”microk8s add-node”命令并生成命令,在工作节点上输入并进行集群化的操作有一定了解,基本上与此相同。
root@k8s-worker01:~# kubeadm join k8s-master:6443 --token pg46jl.pvynngmtqsrukf6l --discovery-token-ca-cert-hash sha256:0497a12ab9c4ff1eb3c21bf6f92d2346c3645a00f54c746a5000f1ffe9a107fc
我会在主节点上确认节点是否被识别。
因为它标记为worker01,所以应该没有问题。虽然状态显示为NotReady,但现在可以不用担心,没关系。
root@k8s-master:~# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 135m v1.27.2
k8s-worker01 NotReady <none> 58s v1.27.2
在master上执行02
我将运行以下的yaml文件,在本地的Kubernetes环境中部署Calico。
root@k8s-master:~# kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
在执行此操作后,等待大约5至10分钟,`pending`状态的 DNS pod 应该会变为`running`,而`NotReady`状态的节点也会变为`Ready`状态。完成这些步骤后,Kubernetes 环境将会搭建完成。
root@k8s-master:~# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-6c99c8747f-xhc26 1/1 Running 0 4m3s
kube-system calico-node-8lhx6 1/1 Running 0 4m3s
kube-system calico-node-w8vcl 1/1 Running 0 4m3s
kube-system coredns-5d78c9869d-sswnk 1/1 Running 0 140m
kube-system coredns-5d78c9869d-zmjp6 1/1 Running 0 140m
kube-system etcd-k8s-master 1/1 Running 0 140m
kube-system kube-apiserver-k8s-master 1/1 Running 2 (82m ago) 140m
kube-system kube-controller-manager-k8s-master 1/1 Running 4 (80m ago) 140m
kube-system kube-proxy-gjlhj 1/1 Running 0 6m15s
kube-system kube-proxy-jkfzg 1/1 Running 0 140m
kube-system kube-scheduler-k8s-master 1/1 Running 1 (90m ago) 140m
root@k8s-master:~# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 140m v1.27.2
k8s-worker01 Ready <none> 6m19s v1.27.2