环境:
Master: CentOS7.4 阿里云
准备加入的Node: CentOS7.4 阿里云
K8s版本:1.7.5
Docker版本:1.12.6
Step 0
为了避免一些意外而关闭防火墙和selinux
Step 1 下载kubernetes 与 Docker
在阿里云的CentOS下,docker直接使用yum下载即可,当前(2018.2)版本为1.12.6
yum install docker
Kubernetes使用阿里云yum源
之后使用yum安装
Step 2下载kubernetes镜像
因为Kubernetes是放在google上的,要翻墙,而在阿里云上是不可以安装Shadowsocks之类的东西的,否则会被查水表…
所以要么就是自己在本地拉下来上传到阿里云镜像仓库中,要么就是直接使用别人做好的镜像.
在本地pull,push到阿里云镜像仓库脚本,注意需要改ALIYUN_URL,muxi为namespace.
12345678910111213141516171819202122232425262728293031set -o errexitset -o nounsetset -o pipefailKUBE_VERSION=v1.7.5KUBE_PAUSE_VERSION=3.0ETCD_VERSION=3.0.17DNS_VERSION=1.14.4GCR_URL=gcr.io/google_containersALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/muxiimages=(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[@]} ; dodocker pull $GCR_URL/$imageNamedocker tag $GCR_URL/$imageName $ALIYUN_URL/$imageNamedocker logindocker push $ALIYUN_URL/$imageNamedocker rmi $ALIYUN_URL/$imageNamedone使用他人做好的镜像
如果觉得上面那个办法比较麻烦,还可以从Docker Hub上获取.我在Docker Hub上发现了一个镜像仓库,一直在跟着k8s版本的更新而更新,基本上历史版本都有.
当然也可以使用脚本来完成任务123456images=(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[@]} ; dodocker pull mirrorgooglecontainers/$imageNamedocker tag mirrorgooglecontainers/$imageName gcr.io/google_containers/$imageNamedocker rmi mirrorgooglecontainers/$imageNamedone
Step 3 配置kubelet 与 Docker
配置kubelet
之后应查看kebelet 与 Docker的Cgroups,若不一致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 配置文件1234567891011121314151617181920212223242526272829303132333435363738394041424344[Unit]Description=Docker Application Container EngineDocumentation=http://docs.docker.comAfter=network.target rhel-push-plugin.socket registries.serviceWants=docker-storage-setup.serviceRequires=docker-cleanup.timer[Service]Type=notifyNotifyAccess=allEnvironmentFile=-/run/containers/registries.confEnvironmentFile=-/etc/sysconfig/dockerEnvironmentFile=-/etc/sysconfig/docker-storageEnvironmentFile=-/etc/sysconfig/docker-networkEnvironment=GOTRACEBACK=crashEnvironment=DOCKER_HTTP_HOST_COMPAT=1Environment=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\$REGISTRIESExecReload=/bin/kill -s HUP $MAINPIDLimitNOFILE=1048576LimitNPROC=1048576LimitCORE=infinityTimeoutStartSec=0Restart=on-abnormalMountFlags=slaveKillMode=process[Install]WantedBy=multi-user.target
之后用
来重启Docker服务以生效
- 改变kubelet Cgroups
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
改变其中的1Environment="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集群加入节点/