在CentOS7中通过kubeadm安装Kubernetes(k8s) Master

1. 故事背景

如果你存下以下情况或者需求,满足一个就可以往下读

  • 没钱用阿里云的Kubernetes服务
  • 没钱用AWS的Kubernetes服务
  • 没钱用其他云的Kubernetes服务
  • 以上均是

2. 提前准备

  • 本次试验是在CentOS 7.4 64位系统,root用户下进行
  • 拥有访问Google的能力,如果你有科学上网的能力,应用到CentOS7可以参考
  • 本次安装的Kubernetes版本是1.11.x

3. 安装kubeadm

官网参考:安装kubeadm使用kubeadm创建master集群,下面是我实践后的简化步骤。

1. 前面有几步检查系统情况(细节查上面链接)

2. 安装docker 并启动

安装docker千万不要用k8s文档上的方式!!

那种方式装的是docker(很老的)!!

现在都是装docker-ce!!

参考下面给的链接!!

3. 安装kubelet、kubeadm、kubectl

如果你有梯子,照着官网的做法即可,如下:

添加k8s的官方源

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

否则添加阿里云的k8s源

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

执行安装 kubelet kubeadm kubectl

setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

注意:这里kubelet启动不起来是正常的(不信你执行journalctl -xeu kubelet看看),当kubeadm init后就会OK

4. kubelet配置cgroup driver

目的:kubelet和docker的cgroup driver一致

查看kubelet使用的cgroup driver,默认是使用systemd(起码我现在的版本是)

> cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd ....

查看docker的cgroup driver

> docker info | grep Cgroup
Cgroup Driver: cgroupfs

如果一致,不需要处理。上面的情况不一样,kubelet是systemd,docker是cgroupfs

如果不一致,你可能会碰到类似的错误”misconfiguration: kubelet cgroup driver: “systemd” is different from docker cgroup driver: “cgroupfs”

以docker为准,修改kubelet配置文件

> vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs ....

重启生效

systemctl daemon-reload
systemctl restart kubelet

4. 初始化master

4.1 选择pod网络插件

源头来自:官网参考

这里只是选择,还不需要安装,插件的不同参数--pod-network-cidr会有不同的值,在kubeadm init时有用,我这里选了flannel

4.2 初始化

# 指定版本,使用flannel作为pod网络
kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.11.0
# 不指定版本
kubeadm init --pod-network-cidr=10.244.0.0/16

这个时候,你可能需要科学上网

假设你没有办法科学上网

可以通过第三方的容器镜像服务,下载对应的K8s Docker镜像,在本地打Tag骗K8S。

提供这样服务的有阿里云、Docker Hub等。具体的做法Google有非常多。

如果有(我用的是这种方式)

  1. 改变docker的代理,官方参考

    • 创建文件夹

      sudo mkdir -p /etc/systemd/system/docker.service.d
      vim /etc/systemd/system/docker.service.d/http-proxy.conf
      
    • 编辑文件内容

      # HTTP_PROXY设置代理地址,NO_PROXY设置不需要走代理的地址
      [Service] 
      Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
      
    • 刷新 & 重启 Docker

      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
  2. 取消服务器本身的http代理

为啥这样干

  1. 因为kubeadm init的时候,需要下载k8s的镜像,所以需要设置docker的代理

  2. 同理,初始化的时候,kubeadm会和服务器本身的局域网通讯,如果服务器自身的代理不取消,会出现无法访问或者访问拒绝的情况,因为外网的代理根本无法访问这个内网的IP

注意:可以使用命令kubeadm config images pull来测试是否正常下载镜像(翻墙是否成功)


提醒:如果kubeadm init出现了无法继续的情况(比如成功了一半那种),可以使用kubeadm reset --force(这里是两个-)重置状态,然后重新init


初始化成功后,会输出一段类似这样的

# 这段要执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 这个暂时不用,这段是后面node加入master时使用的
kubeadm join 172.16.224.34:6443 --token lc8imt.grx159aia7115ngk --discovery-token-ca-cert-hash sha256:2174a53f2d7c7f59ee3d425e2da069a70c251e2192b3375e1361dcc50f46a066

注意:kubeadm join语句忘记了也没关系,通过命令可查看,kubeadm token create --print-join-command

4.3 安装pod网络

我选了flannel

sysctl net.bridge.bridge-nf-call-iptables=1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

5. Master隔离

默认情况下,出于安全原因,是不允许在master上调度pods。如果你想在master上调度pods,譬如用于研发的单主机k8s。你可以运行:

kubectl taint nodes --all node-role.kubernetes.io/master-

大概会输出:

node "test-01" untainted

如果你不执行上面那个命令,对于单主机的情况,你会发现你的pods会一直出于Pending状态

如果你后面想取消了,通过以下命令

kubectl taint nodes {your-master-node-name} node-role.kubernetes.io/master=:NoSchedule

节点名称可以通过kubectl get nodes查看。

6. 结果

完成上面的步骤,等待一会(下载k8s的镜像),理论上可以初始化成功。

注意:成功后,最好把Docker的代理取消,基本上后面是用不上的了(反正我是取消了),而且可以排除掉许多网络问题。(譬如你用阿里云镜像服务的内网地址)

(这个过程是当时我搭建的非完整经历,当时记录了大概的过程,会有部分异常情况没记录下来,因为是搭建好后几周才写的这篇总结,所以可能会有所疏漏,如果你尝试了有问题,可以留言讨论)