环境:
Master: CentOS7.4 阿里云
准备加入的Node: CentOS7.4 阿里云
K8s版本:1.7.5
Docker版本:1.12.6

Step 0

为了避免一些意外而关闭防火墙和selinux

1
2
3
4
5
systemctl disable firewalld
systemctl stop firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

Step 1 下载kubernetes 与 Docker

在阿里云的CentOS下,docker直接使用yum下载即可,当前(2018.2)版本为1.12.6
yum install docker
Kubernetes使用阿里云yum源

1
2
3
4
5
6
7
8
# kubernetes yum源
cat >> /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

之后使用yum安装

1
2
3
4
5
6
7
8
# 查看版本
yum list kubeadm –showduplicates
yum list kubernetes-cni –showduplicates
yum list kubelet –showduplicates
yum list kubectl –showduplicates
# 根据版本安装
yum install -y kubernetes-cni-0.5.1-0.x86_64 kubelet-1.7.5-0.x86_64 kubectl-1.7.5-0.x86_64 kubeadm-1.7.5-0.x86_64

Step 2下载kubernetes镜像

因为Kubernetes是放在google上的,要翻墙,而在阿里云上是不可以安装Shadowsocks之类的东西的,否则会被查水表…
所以要么就是自己在本地拉下来上传到阿里云镜像仓库中,要么就是直接使用别人做好的镜像.

  • 在本地pull,push到阿里云镜像仓库脚本,注意需要改ALIYUN_URL,muxi为namespace.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #!/bin/bash
    set -o errexit
    set -o nounset
    set -o pipefail
    KUBE_VERSION=v1.7.5
    KUBE_PAUSE_VERSION=3.0
    ETCD_VERSION=3.0.17
    DNS_VERSION=1.14.4
    GCR_URL=gcr.io/google_containers
    ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/muxi
    images=(kube-proxy-amd64:${KUBE_VERSION}
    kube-scheduler-amd64:${KUBE_VERSION}
    kube-controller-manager-amd64:${KUBE_VERSION}
    kube-apiserver-amd64:${KUBE_VERSION}
    pause-amd64:${KUBE_PAUSE_VERSION}
    etcd-amd64:${ETCD_VERSION}
    k8s-dns-sidecar-amd64:${DNS_VERSION}
    k8s-dns-kube-dns-amd64:${DNS_VERSION}
    k8s-dns-dnsmasq-nanny-amd64:${DNS_VERSION})
    for imageName in ${images[@]} ; do
    docker pull $GCR_URL/$imageName
    docker tag $GCR_URL/$imageName $ALIYUN_URL/$imageName
    docker login
    docker push $ALIYUN_URL/$imageName
    docker rmi $ALIYUN_URL/$imageName
    done
  • 使用他人做好的镜像
    如果觉得上面那个办法比较麻烦,还可以从Docker Hub上获取.我在Docker Hub上发现了一个镜像仓库,一直在跟着k8s版本的更新而更新,基本上历史版本都有.
    当然也可以使用脚本来完成任务

    1
    2
    3
    4
    5
    6
    images=(etcd-amd64:3.0.17 pause-amd64:3.0 kube-proxy-amd64:v1.7.5 kube-scheduler-amd64:v1.7.5 kube-controller-manager-amd64:v1.7.5 kube-apiserver-amd64:v1.7.5 kubernetes-dashboard-amd64:v1.6.1 k8s-dns-sidecar-amd64:1.14.4 k8s-dns-kube-dns-amd64:1.14.4 k8s-dns-dnsmasq-nanny-amd64:1.14.4)
    for imageName in ${images[@]} ; do
    docker pull mirrorgooglecontainers/$imageName
    docker tag mirrorgooglecontainers/$imageName gcr.io/google_containers/$imageName
    docker rmi mirrorgooglecontainers/$imageName
    done

Step 3 配置kubelet 与 Docker

配置kubelet

1
2
3
4
cat > /etc/systemd/system/kubelet.service.d/20-pod-infra-image.conf <<EOF
[Service]
Environment="KUBELET_EXTRA_ARGS=--pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.0"
EOF

之后应查看kebelet 与 Docker的Cgroups,若不一致kubelet会无法运行.
使用

1
2
3
4
systemctl enable docker
systemctl enable kubelet
systemctl start docker
systemctl start kubelet

来启动相关组件,若出现cgroups问题,就需要根据情况来改变Docker或者Kubelet的cgroups, 还应注意与集群的cgroups应尽量一致.

  • 改变Docker Cgroups
    Docker的配置文件位置是/etc/systemd/system/multi-user.target.wants/docker.service或者/etc/systemd/system/docker.service.d/
    Docker 配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    [Unit]
    Description=Docker Application Container Engine
    Documentation=http://docs.docker.com
    After=network.target rhel-push-plugin.socket registries.service
    Wants=docker-storage-setup.service
    Requires=docker-cleanup.timer
    [Service]
    Type=notify
    NotifyAccess=all
    EnvironmentFile=-/run/containers/registries.conf
    EnvironmentFile=-/etc/sysconfig/docker
    EnvironmentFile=-/etc/sysconfig/docker-storage
    EnvironmentFile=-/etc/sysconfig/docker-network
    Environment=GOTRACEBACK=crash
    Environment=DOCKER_HTTP_HOST_COMPAT=1
    Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
    #!
    #在ExecStart后改变原有--exec-opt native.cgroupdriver=cgroupfs即可
    #若想要改为systemd,只需改为--exec-opt native.cgroupdriver=systemd
    #!
    ExecStart=/usr/bin/dockerd-current \
    --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
    --default-runtime=docker-runc \
    --exec-opt native.cgroupdriver=cgroupfs \
    --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
    $OPTIONS \
    $DOCKER_STORAGE_OPTIONS \
    $DOCKER_NETWORK_OPTIONS \
    $ADD_REGISTRY \
    $BLOCK_REGISTRY \
    $INSECURE_REGISTRY\
    $REGISTRIES
    ExecReload=/bin/kill -s HUP $MAINPID
    LimitNOFILE=1048576
    LimitNPROC=1048576
    LimitCORE=infinity
    TimeoutStartSec=0
    Restart=on-abnormal
    MountFlags=slave
    KillMode=process
    [Install]
    WantedBy=multi-user.target

之后用

1
2
systemctl daemon-reload
systemctl restart docker.service

来重启Docker服务以生效

  • 改变kubelet Cgroups
    vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
    改变其中的
    1
    Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"

参数即可
之后重启kubelet可生效.
不过在我的实际操作中,并没能成功改变kubelet的cgroups, 之后改变Docker Cgroups成功了.

Step 4 Join节点

进入Master节点,使用 kubeadm token list获取Token
在Node节点处使用 kubeadm join --token=<token> <ip-of-master>:<port> 其中port默认为6443.
之后在Master节点处使用kubelet get nodes 即可查看Node是否成功加入到集群中.
若节点状态为NotReady, 则需要在Node节点处检查Kubelet是否有错误.

本文地址: http://Humbertzhang.github.io/2018/02/21/利用Kubeadm向Kubernetes集群加入节点/