使用单节点Kubernetes在Amazon Linux 2023上的Lightsail
因为这次我们需要验证,所以我做了个备忘录,准备在Amazon Linux 2023的Lightsail上试试看。
虽然我以为会很麻烦,但可能是历史上最简单的了。不吃亏,真不错。
这次要尝试的配置如下:
– 使用AWS Lightsail,操作系统为Amazon Linux 2023(Amazon Linux 2023 2023.2.20231113.0),选择了一台具有2个CPU和2GB内存的价格为10美元的实例。内存要求至少为2GB。
– 容器运行时采用containerd(v1.7.8)
– 通过kubeadm安装kubernetes v1.28
– 网络驱动使用flannel(v0.23.0)
1. 直到引入容器运行时。
省略了在使用ssh客户端连接时获取Lightsail的SSH密钥的步骤。
使用putty -i lightsail.ppk ec2-user@13.231.194.245的命令进行连接。
在进行OS的准备工作时,请参考Kubernetes官方文档中的以下内容。虽然有提供日语翻译,但术语如master节点等仍然保留着相当古老的说法。Kubernetes的知名度也逐渐下降。
相关文档链接:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
2023年的Amazon Linux真不错,我觉得最好的一点是selinux默认处于宽容模式,并且firewalld默认不运行。正因为是云平台,所以感到非常激动。只是禁用内存交换有点麻烦。
操作系统准备步骤如下:
$ sudo -i
# dnf remove -y zram-generator-defaults
# swapoff -a
# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# sudo modprobe overlay
# sudo modprobe br_netfilter
# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# sudo sysctl --system
接下来,我们将引入containerd作为容器运行时。
containerd的安装步骤请参考以下链接:
https://github.com/containerd/containerd/blob/main/docs/getting-started.md#getting-started-with-containerd
https://github.com/containerd/containerd/releases
https://github.com/opencontainers/runc/releases
https://github.com/containernetworking/plugins/releases
# wget https://github.com/containerd/containerd/releases/download/v1.7.8/containerd-1.7.8-linux-amd64.tar.gz
# tar Cxzvf /usr/local containerd-1.7.8-linux-amd64.tar.gz
# wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
# cp containerd.service /etc/systemd/system/
# systemctl daemon-reload
# systemctl enable --now containerd
# wget https://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64
# install -m 755 runc.amd64 /usr/local/sbin/runc
# wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
# mkdir -p /opt/cni/bin
# tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.3.0.tgz
如果安装了containerd,则需要修改cgroup驱动程序。这个文件的文档很弱,会显示“config.toml文件不存在,是什么鬼”,但这是由containerd默认生成的文件。
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd
如果您安装了containerd,您需要进行cgroup驱动程序的修改。这个文件的文档不太完善,当运行时显示“没有config.toml文件,这是怎么回事”时,这是containerd默认生成的文件。
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd
# mkdir /etc/containerd
# containerd config default > /etc/containerd/config.toml
# sed -i /etc/containerd/config.toml -e "s/SystemdCgroup = false/SystemdCgroup = true/"
# systemctl restart containerd
直到引入Kubernetes为止。
containerdまで導入したら、kubeadm等をインストールして、Kubernetesクラスターを作る。
なおAmazon LinuxはRed Hat-based distributionsに該当し、yumコマンドを使う。
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
# cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
# sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# sudo systemctl enable --now kubelet
当kubelet启动后,执行kubeadm init命令。由于Lightsail的内部IP地址为172.〜,因此Kubernetes的内部IP地址应设置为192.168.0.0/16。如果没有tc命令,会发出警告,但不必担心。由于这次不需要准备Worker节点,所以不需要,但如果需要,请将输出中的最后一行kubeadm join 〜记录下来。
# kubeadm init --pod-network-cidr=192.168.0.0/16
(出力結果)
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.26.15.202:6443 --token t0roiz.klgeb1t2eio494up \
--discovery-token-ca-cert-hash sha256:3579401727d150598adeba7a333c9111479a688f00cad589a40a9c5d1c7f4cb2
设置KUBECONFIG,允许在CP节点上运行用户Pod,并等待除coredns之外的Pod启动。
# export KUBECONFIG=/etc/kubernetes/admin.conf
# kubectl taint nodes --all node-role.kubernetes.io/control-plane-
# kubectl get pod -A
(以下のようにPodが起動してくるのを待つ)
[root@ip-172-26-15-202 ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5dd5756b68-bxmn6 0/1 Pending 0 12m
kube-system coredns-5dd5756b68-kngv7 0/1 Pending 0 12m
kube-system etcd-ip-172-26-15-202.ap... 1/1 Running 0 13m
kube-system kube-apiserver-ip-172-26... 1/1 Running 0 13m
kube-system kube-controller-manager-... 1/1 Running 0 13m
kube-system kube-proxy-8968n 1/1 Running 0 12m
kube-system kube-scheduler-ip-172-26... 1/1 Running 0 13m
起動したら、ネットワークドライバ(今回はflannel)を導入する。念のため、flannelのバージョンはlatestではなく0.23.0。導入後、flannelとcorednsが起動するのを確認する。
https://github.com/flannel-io/flannel#deploying-flannel-manually
https://github.com/flannel-io/flannel/releases
# wget https://github.com/flannel-io/flannel/releases/download/v0.23.0/kube-flannel.yml
# sed -i kube-flannel.yml -e "s/10.244.0.0/192.168.0.0/"
# kubectl create -f kube-flannel.yml
# kubectl get pod -A
(以下のようにPodが起動するのを確認)
[root@ip-172-26-15-202 ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-lt2jl 1/1 Running 0 25s
kube-system coredns-5dd5756b68-bxmn6 1/1 Running 0 25m
kube-system coredns-5dd5756b68-kngv7 1/1 Running 0 25m
kube-system etcd-ip-172-26-15-202.ap... 1/1 Running 0 25m
kube-system kube-apiserver-ip-172-26... 1/1 Running 0 25m
kube-system kube-controller-manager-... 1/1 Running 0 25m
kube-system kube-proxy-8968n 1/1 Running 0 25m
kube-system kube-scheduler-ip-172-26... 1/1 Running 0 25m
此外,由于我们此次使用的网络驱动是Flannel,并且需要使用Calico来实现NetworkPolicy,因此可能需要在防火墙上允许IPIP通信。
其他
由于我想要验证的是另一件事情,所以没关系,但是本次使用的Amazon Linux 2023版本的Linux Kernel为6.1。而要验证User Namespaces需要6.3版本,所以目前不足。说到6.3,就是先前构建的Fedora 38的Linux Kernel版本为6.3。
https://kubernetes.io/blog/2023/09/13/userns-alpha/#node-system-requirements
以下是在Amazon Linux 2023上运行”uname -r”命令的结果。
[root@ip-172-26-15-202 ~]# uname -r
6.1.61-85.141.amzn2023.x86_64