使用kubeadm快速在阿里云 ECS 上快速部署kubernetes 1.18 集群

虚机准备

准备三台虚机(2核4G以上配置),使用aliyun Linux镜像,设置好hostname,然后分别配置好没台机器的/etc/hosts, 示例如下:

172.26.249.118 k8smaster.tech
172.26.249.119 k8snode1.tech    
172.26.249.120 k8snode2.tech

修改hostname命令如下,分别在各自机器上执行。

hostnamectl set-hostname k8smaster.tech
hostnamectl set-hostname k8snode1.tech
hostnamectl set-hostname k8snode2.tech

配置好各自hostname及域名和IP的映射之后,后面的配置都是基于hostname配置。

阿里云ECS(aliyun Linux)已经关闭SElinux、Firewalld服务及Swap服务,如果选择的镜像没有关闭,需要手动关闭。

安装基础软件(Master && Node)

安装基础软件Docker

yum -y install yum-utils lvm2 device-mapper-persistent-data nfs-utils xfsprogs wget
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce docker-ce-cli containerd.io

修改docker引擎的配置

修改Docker Cgroup Driver为systemd, 并设置响应的镜像。

mkdir /etc/docker
touch /etc/docker/daemon.json
cat > /etc/docker/daemon.json <<EOF
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "100m"
    },
    "storage-driver": "overlay2",
    "registry-mirrors":[
        "https://kfwkfulq.mirror.aliyuncs.com",
        "https://2lqq34jg.mirror.aliyuncs.com",
        "https://pee6w651.mirror.aliyuncs.com",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
    ]
}
EOF

重启Docker

systemctl daemon-reload
systemctl enable  --now docker

安装部署kubernetes

Kuberntes Repo添加

添加编辑/etc/yum.repos.d/kubernetes.repo, 国内网络问题,这里使用阿里云的镜像。

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

Master上安装kubeadm、kubelet、kubectl(master)

yum install -y kubelet kubeadm kubectl 
systemctl enable --now kubelet

这个时候kubelet一直启动报错, 不停重启。可以使用journalctl -u kubelet查看日志。 参考:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ The kubelet is now restarting every few seconds, as it waits in a crashloop for kubeadm to tell it what to do.

Master节点部署

kubeadm init \
        --apiserver-advertise-address 0.0.0.0 \
        --apiserver-bind-port 6443 \
        --cert-dir /etc/kubernetes/pki \
        --control-plane-endpoint k8smaster.tech \
        --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
        --kubernetes-version 1.18.2 \
        --pod-network-cidr 10.10.0.0/16 \
        --service-cidr 10.20.0.0/16 \
        --service-dns-domain cluster.local \
        --upload-certs

日志末尾打印出join的命令,记录下来,后面节点加入的时候使用, 类似如下:

You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join k8smaster.tech:6443 --token ypeiz4.7zsdtx2jjxpdlypr \
    --discovery-token-ca-cert-hash sha256:54fac7e65287f78cf73cb0357bc3cd6c62830ae1f0beb1257f4d1cfce948bad8 \
    --control-plane --certificate-key cb95b38b24e63862ba3deed1bf1a1da05b69f58e4e19faaf4cabf409e7bfe16f

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join k8smaster.tech:6443 --token ypeiz4.7zsdtx2jjxpdlypr \
    --discovery-token-ca-cert-hash sha256:54fac7e65287f78cf73cb0357bc3cd6c62830ae1f0beb1257f4d1cfce948bad8

下面这个为了"以普通用户身份管理集群", 但是root用户也需要执行一遍,否则后面会报错

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

Master节点上进行网络配置

集群必须安装网络插件以实现Pod间通信,只需要在Master节点操作,其他Node节点会自动创建相关Pod;

该配置文件默认采用的Pod的IP地址为192.168.0.0/16,需要修改为集群初始化参数中采用的值,本例中为10.10.0.0/16;

wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
sed -i "s#192\.168\.0\.0/16#10\.10\.0\.0/16#" calico.yaml
kubectl apply -f calico.yaml

等待所有容器状态处于Running状态:可以通过命令watch -n 2 kubectl get pods -n kube-system -o wide来实时观察。通过命令kubectl get nodes -o wide 查看所有node状态。

尝试过用flunnel,但是失败告终, 可能是还不支持最新的kubernetes 1.18

也可以通过命令kubeadm token create --print-join-command > node.join.sh生产join 脚本。

Node节点加入

按照和master一样的步骤安装docker后, 安装kubeadm、kubelet

yum install -y kubelet kubeadm 
systemctl enable --now kubelet

使用master部署的时候记录的join命令加入集群。 (注意去掉--control-plane 开始的部分,这个是用来加入master节点的,本示例没有用到)

最后更新于 3rd Nov 2022