跳转至

使用 Kubeadm 快速部署K8S环境


2020-03-05 by dongnan

目标

  • 使用 kubeadm 完成 kubernetes 安装配置任务。

环境描述

目标 k8s集群由一个Master管理节点、两个Worker计算节点组成。

主机: AliYun ecs.g6.large 2c/8G
OS: Ubuntu Server 18.04
Docker: docker-ce:18.09.9
Kubernetes: v1.17.x
网络: 使用相同的 VPC 与 安全组
角色: 
    master: 
        主机名: host0
        IP: 10.0.20.20
    worker: 
        主机名: host1
        IP: 10.0.20.21
        主机名: host2
        IP: 10.0.20.22

准备工作

Docker 容器运行时

配置apt

apt -y install apt-transport-https \
    ca-certificates curl gnupg-agent \
    software-properties-common bash-completion
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -;
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable";

列出仓库中的版本

apt-cache madison docker-ce

当前 kubernetes v1.17 版本支持 docker-ce:18.09.x

apt install docker-ce=5:18.09.9~3-0~ubuntu-bionic \
    docker-ce-cli=5:18.09.9~3-0~ubuntu-bionic

配置文件

# 默认情况没有这个文件需要自行创建
cat  /etc/docker/daemon.json
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m",
        "max-file": "5"
    },
    "max-concurrent-downloads": 9,
    "max-concurrent-uploads": 9,
    "bip": "192.168.255.1/24",
    "registry-mirrors": [
        "https://registry.docker-cn.com",
        "https://registry.cn-hangzhou.aliyuncs.com"
    ]
}

# log-opts 配置日志文件大小。
# max-concurrent-downloads(uploads) 配置镜像下载\上传并发数。
# bip 配置docker0的网络接口默认IP地址,避免与主机使用的网络冲突。
# registry-mirrors 配置镜像加速地址。

重启Docker守护进程

systemctl restart docker

查看info信息

docker info

配置NFS客户端(可选)

apt update && apt -y install nfs-common
echo "options sunrpc tcp_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
echo "options sunrpc tcp_max_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf

关闭 swap

kubernetes 官方文档指明需要关闭swap。如果不关闭K8s运行会出现错误。

# 永久关闭swap方式请自行搜索
sudo swapoff -a

配置 kubernetes 源

使用 aliyun 提供的 kubernetes 源。

apt update && apt install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

安装 kubeadm 工具

默认apt安装为最新的版本,这里指定v1.17版本。

apt update
apt install kubeadm=1.17.4-00  kubelet=1.17.4-00 kubectl=1.17.4-00

# 默认则是最新版,目前是 kubernetes v1.18.0
# apt update && apt install -y kubelet kubeadm kubectl

配置步骤

配置 Master

设置环境变量
export MASTER_IP=10.0.20.20
export APISERVER_NAME=master.zzx
export POD_SUBNET=172.18.0.0/16
export SERVICE_SUBNET=172.19.0.0/16
echo "${MASTER_IP}   ${APISERVER_NAME}" >> /etc/hosts

注意

  • APISERVER_NAME 不能是 masterhostname
  • APISERVER_NAME 必须全为小写字母、数字、小数点,不能包含减号
  • POD_SUBNET \SERVICE_SUBNET 所使用的网段不能与 master/worker节点所在的网段重叠。
创建 kubeadm-config
cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.17.4
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
  serviceSubnet: "${SERVICE_SUBNET}"
  podSubnet: "${POD_SUBNET}"
  dnsDomain: "zzx"
EOF

注意,dnsDomain 默认为 local 可以根据需求修改。

初始化 master

下载镜像可能需要等候3-10分钟左右。

kubeadm init --config=kubeadm-config.yaml --upload-certs
# 忽略信息
#W0428 17:39:44.798886 xx Cannot validate kube-proxy config - no validator is available
#W0428 17:39:44.798914 xx Cannot validate kubelet config - no validator is available
配置 kubectl

按照提示配置.kube目录保存相配置信息,这样不用每次都输入相关的认证信息。

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
配置 Calico 网络插件
# yaml文件
wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml

# calico 镜像保存在 Docker Hub,可能遇到下载失败需耐心等待。
kubectl apply -f calico-3.13.1.yaml

注意,可能会遇到 coredns 长时间 pending状态,确保cni网络插件容器已经运行。

检查系统 Pod 状态

直到所有的容器组处于 Running 状态

kubectl get pod -n kube-system

calico-kube-controllers-788d6b9876-f87mr   1/1     Running   0          66m
calico-node-5lqmz                          1/1     Running   0          66m
coredns-7f9c544f75-sx9s4                   1/1     Running   0          73m
coredns-7f9c544f75-vs84q                   1/1     Running   0          73m
etcd-khost0                                1/1     Running   0          73m
kube-apiserver-khost0                      1/1     Running   0          73m
kube-controller-manager-khost0             1/1     Running   0          73m
kube-proxy-6spzf                           1/1     Running   0          73m
kube-scheduler-khost0                      1/1     Running   0          73m
查看 Master 状态
kubectl get nodes
NAME    STATUS   ROLES    AGE     VERSION
host0   Ready    master   8m52s   v1.17.4

注意: 状态为 Ready 表示 master 初始化完毕

配置 Worker

获得加入集群的命令参数

Master 上执行,用于获取kubeadm join 命令及参数。

kubeadm token create --print-join-command

返回类似如下的命令,这些命令将稍后在 worker节点使用。

kubeadm join master.zzx:6443 \
    --token 60863m.wupvlnezupvz7ale \
    --discovery-token-ca-cert-hash \
    sha256:622f193d#省略x1a68d
添加 Worker 节点

Worker 节点依次执行

export MASTER_IP=10.0.20.20
export APISERVER_NAME=master.zzx
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts

kubeadm join master.zzx:6443 \
    --token 60863m.wupvlnezupvz7ale \
    --discovery-token-ca-cert-hash \
    sha256:622f193d#...省略x1a68d

检查 Worker 状态

# 在 master 上执行
kubectl get nodes
NAME    STATUS     ROLES    AGE   VERSION
host0   Ready      master   38m   v1.17.4
host1   NotReady   <none>   29s   v1.17.4

注意: worker 节点会下载镜像请耐心等待,状态为 Ready 表示 Worker 初始化完毕

验证

Yaml 文档

创建一个 Deployment ,下面是准备好的 yaml文档。

cat ngx-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        env:
          - name: logtail
            value: 'true'

创建 Deployment

Master 节点执行

kubectl apply -f ngx-deploy.yaml 
deployment.apps/nginx-deployment created

检查 Pod 状态

通过 deployment 创建 pod 成功。

kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-59d958898f-4fwdx   1/1     Running   0          110s
nginx-deployment-59d958898f-7nfr2   1/1     Running   0          110s

扩展-重置 kubernetes (可选)

如果觉得 kubernetes 配置过程复杂,希望加强记忆多做几次安装配置工作,可以移除 worker 节点、重新初始化 master节点,然后重新开始。

首先在 Master 上移除 Worker 节点

# 在 master 节点依次删除节点命令
kubectl delete node demo02

然后依次在 MasterWorker 节点执行重置命令

kubeadm reset

参考

回到页面顶部