创建企业Kubernetes多主机集群环境

1 创建两个节点(两个虚拟机)

在VMWare中创建完整克隆,分别命名为UbuntuNode1UbuntuNode2

分别对两个完整克隆的虚拟机进行如下操作,修改主机名称和静态IP

  1. 使用root用户登录

  2. 打开配置文件vim /etc/cloud/cloud.cfg

  3. 修改配置preserve_hostname: true

  4. 修改/etc/hostname,只有一行 node1node2

2 master和node基础配置

2.1 给node配置hostname

node1主机

/etc/hostname

node1

node2主机

/et/hostname

node2

2.确认配置的三台机器的主机名称

$ cat /etc/hosts
$ shutdown -r now

2.2 配置IP地址

  • master

/etc/netplan/50-cloud-init.yaml

network:
    ethernets:
        ens33:
            addresses: [192.168.236.177/24]
            dhcp4: false
            gateway4: 192.168.236.2
            nameservers:
                       addresses: [192.168.236.2]
            optional: true
    version: 2

重启ip配置

netplan apply
  • node1

/etc/netplan/50-cloud-init.yaml

network:
    ethernets:
        ens33:
            addresses: [192.168.236.178/24]
            dhcp4: false
            gateway4: 192.168.236.2
            nameservers:
                       addresses: [192.168.236.2]
            optional: true
    version: 2

重启ip配置

netplan apply
  • node2

/etc/netplan/50-cloud-init.yaml

network:
    ethernets:
        ens33:
            addresses: [192.168.236.179/24]
            dhcp4: false
            gateway4: 192.168.236.2
            nameservers:
                       addresses: [192.168.236.2]
            optional: true
    version: 2

重启ip配置

netplan apply

2.3 修改hosts文件

注意: (Master、Node1、Node2都需要配置)

使用root用户登录

  1. 打开hosts文件 vim /etc/hosts

  2. 输入如下内容

    192.168.236.177 master
    192.168.236.178 node1
    192.168.236.179 node2
    
  3. 重启机器shutdown -r now

3 配置Master节点

3.1 创建工作目录

$ mkdir /home/itcast/working
$ cd /home/itcast/working/

3.2 创建kubeadm.conf配置文件

  1. 创建k8s的管理工具kubeadm对应的配置文件,候选操作在home/itcast/working/目录下

使用kubeadm配置文件,通过在配置文件中指定docker仓库地址,便于内网快速部署。

生成配置文件

kubeadm config print init-defaults ClusterConfiguration > kubeadm.conf
  1. 修改kubeadm.conf中的如下两项:
  • imageRepository
  • kubernetesVersion
vi kubeadm.conf
# 修改 imageRepository: k8s.gcr.io
# 改为 registry.cn-beijing.aliyuncs.com/imcto
imageRepository: registry.cn-beijing.aliyuncs.com/imcto
# 修改kubernetes版本kubernetesVersion: v1.13.0
# 改为kubernetesVersion: v1.13.1
kubernetesVersion: v1.13.1
  1. 修改kubeadm.conf中的API服务器地址,后面会频繁使用这个地址。
  • localAPIEndpoint:
localAPIEndpoint:
  advertiseAddress: 192.168.236.177
  bindPort: 6443

注意: 192.168.236.177是master主机的ip地址

  1. 配置子网网络
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}

这里的10.244.0.0/1610.96.0.0/12分别是k8s内部pods和services的子网网络,最好使用这个地址,后续flannel网络需要用到。

3.3 拉取K8s必备的模块镜像

  1. 查看一下都需要哪些镜像文件需要拉取

注意这个 kubeadm.conf的格式问题,很可能出现解析出错的问题。

$ kubeadm config images list --config kubeadm.conf
registry.cn-beijing.aliyuncs.com/imcto/kube-apiserver:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-controller-manager:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-scheduler:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-proxy:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/pause:3.1
registry.cn-beijing.aliyuncs.com/imcto/etcd:3.2.24
registry.cn-beijing.aliyuncs.com/imcto/coredns:1.2.6
  1. 拉取镜像
#下载全部当前版本的k8s所关联的镜像
kubeadm config images pull --config ./kubeadm.conf

3.4 初始化kubernetes环境

#初始化并且启动
$ sudo kubeadm init --config ./kubeadm.conf

更多kubeadm配置文件参数详见

kubeadm config print-defaults

k8s启动成功输出内容较多,但是记住末尾的内容

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 192.168.236.177:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:e778d3665e52f5a680a87b00c6d54df726c2eda601c0db3bfa4bb198af2262a8

按照官方提示,执行以下操作。

  1. 执行如下命令

    $ mkdir -p $HOME/.kube
    $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  2. 创建系统服务并启动

    # 启动kubelet 设置为开机自启动
    $ sudo systemctl enable kubelet
    # 启动k8s服务程序
    $ sudo systemctl start kubelet
    

3.5 验证kubernetes启动结果

  1. 验证输入,注意显示master状态是NotReady,证明初始化服务器成功
$ kubectl get nodes
NAME     STATUS     ROLES    AGE   VERSION
master   NotReady   master   12m   v1.13.1
  1. 查看当前k8s集群状态
$ kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}

目前只有一个master,还没有node,而且是NotReady状态,那么我们需要将node加入到master管理的集群中来。在加入之前,我们需要先配置k8s集群的内部通信网络,这里采用的是flannel网络。

3.6 部署集群内部通信flannel网络

$cd $HOME/working
$wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

编辑这个文件,确保flannel网络是对的,找到net-conf.json标记的内容是否正确。

 net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }

这个"10.244.0.0/16"和 ./kubeadm.conf中的podsubnet的地址要一致。

应用当前flannel配置文件

itcast@master:~/working$ kubectl apply -f kube-flannel.yml 

输出结果如下

root@master:~/working# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created

安装flannel网络前 执行kubectl get nodes输出结果如下

itcast@master:~/working$ kubectl get node
NAME     STATUS     ROLES    AGE   VERSION
master   NotReady   master   10m   v1.13.1

安装flannel网络后 执行kubectl get nodes输出结果如下

itcast@master:~/working$ kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   10m   v1.13.1

此时master已经是Ready状态了,表示已经配置成功了,那么我们就需要配置node来加入这个集群。

4 配置Node

4.1 确认外部环境

  1. 确认关闭swap

    apt install -y selinux-utils
    swapoff -a
    
  2. 禁止selinux

    setenforce 0
    
  3. 确认关闭防火墙

    ufw disable
    

4.2 配置k8s集群的Node主机环境

  1. 启动k8s后台服务

    # 启动kubelet 设置为开机自启动
    $ sudo systemctl enable kubelet
    # 启动k8s服务程序
    $ sudo systemctl start kubelet
    
  2. 将master机器的/etc/kubernetes/admin.conf传到到node1和node2

    登录master终端

    #将admin.conf传递给node1
    sudo scp /etc/kubernetes/admin.conf itcast@192.168.236.178:/home/itcast/
    ##我实际上 sudo scp /etc/kubernetes/admin.conf root@192.168.236.178:/root/
    #将admin.conf传递给node2
    sudo scp /etc/kubernetes/admin.conf itcast@192.168.236.179:/home/itcast/
    
  3. 登录node1终端,创建基础kube配置文件环境

$ mkdir -p $HOME/.kube
$ sudo cp -i $HOME/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 登录node2终端,创建基础kube配置文件环境
$ mkdir -p $HOME/.kube
$ sudo cp -i $HOME/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. node1node2分别连接master加入master集群。这里用的是kubeadm join指令
$ sudo kubeadm join 192.168.236.177:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:e778d3665e52f5a680a87b00c6d54df726c2eda601c0db3bfa4bb198af2262a8

## 地下这个是我的
kubeadm join 192.168.236.177:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:77391e08bf9f802ce3655c2a8bcde21d301b52bea36e7e1a1cbbc1298ad7a4af

这里要注意,使用的hash应该是master主机 kubeadm init成功之后生成的hash码。

  1. 应用两个node主机分别应用flannel网络

master中的kube-flannel.yml分别传递给两个node节点.

#将kube-flannel.yml传递给node1
sudo scp $HOME/working/kube-flannel.yml itcast@192.168.236.178:/home/itcast/
#将kube-flannel.yml传递给node2
sudo scp $HOME/working/kube-flannel.yml itcast@192.168.236.179:/home/itcast/

分别启动flannel网络

itcast@node1:~$ kubectl apply -f kube-flannel.yml 
itcast@node2:~$ kubectl apply -f kube-flannel.yml
  1. 查看node是否已经加入到k8s集群中(需要等一段时间才能ready)
itcast@node2:~$ kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   35m     v1.13.1
node1    Ready    <none>   2m23s   v1.13.1
node2    Ready    <none>   40s     v1.13.1
Logo

开源、云原生的融合云平台

更多推荐