k8s-1.16单主节点集群部署

2020/01/10 posted in  Kubernetes

机器要求

单主集群一般用于开发环境,至少需要大于2台机器,一台作为主节点,其余的作为工作节点,机器间可以相互访问即可。

Hostname Ip Role
k8s-master 192.168.122.2 Master Node
k8s-node-01 192.168.122.101 Worker Node
k8s-node-02 192.168.122.102 Worker Node
K8s-node-03 192.168.122.103 Worker Node

需要注意:

如果你使用的是云服务器,服务器只有一块网卡,外网IP通过弹性IP绑定,请不要使用公网IP,使用内网网卡绑定的IP来通信。原因是,k8s只会监听网卡绑定IP的端口。

安装准备

  1. 禁用Swap
    k8s为了使容器的调度更符合机器的实际资源情况,k8s建议关闭内存交换

    swapoff -a
    

    同时删除/etc/fstab中swap那条记录

    当然,如果你的机器资源确实不多,需要利用swap,那么你可以不关闭swap交换空间,通过如下参数告诉k8s开启swap

    kubelet --fail-swap-on=false ...
    
  2. 关闭防火墙(开发环境)

    Ubuntu

    sudo ufw disable
    

    CentOS

    systemctl stop firewalld
    systemctl disable firewalld
    
  3. 禁用SELinux(开发环境)

    sudo apt install selinux-utils
    setenforce 0
    
  4. 确认mac地址以及product uuid唯一
    如果你的服务器是通过虚拟机克隆过来的,请确保这两项唯一

    ip link #检查mac地址
    sudo cat /sys/class/dmi/id/product_uuid ##检查uuid
    

Docker安装(可选)

由于k8s需要安装指定docker18.06版本,所以如果你的版本不对,可以先卸载重新安装

sudo apt-get remove docker docker-engine docker-ce docker.io

安装docker

# 从 Ubuntu 的存储库安装 Docker:
apt-get update
apt-get install -y docker.io

# 或者从 Docker 的 Ubuntu 或 Debian 镜像仓库中安装 Docker CE 18.06:

## 安装环境准备。
apt-get update && apt-get install apt-transport-https ca-certificates curl software-properties-common

## 下载 GPG 密钥。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

## 添加 docker apt 镜像仓库。
add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

## 安装 docker。
apt-get update && apt-get install docker-ce=18.06.0~ce~3-0~ubuntu

# 设置守护进程。
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

# 重启 docker。
systemctl daemon-reload
systemctl restart docker

开始安装 (切换到root身份)

  1. 安装相关工具

    apt-get update && apt-get install -y apt-transport-https curl
    
  2. 添加k8s软件源

    添加阿里源密钥

    curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
    

    添加k8s阿里源

    cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    EOF
  3. 安装 kubelet,kubeadm,kubectl

    apt-get update
    apt-get install -y kubelet kubeadm kubectl
    apt-mark hold kubelet kubeadm kubectl

    非root用户需要加上sudo

部署master

初始化master节点

kubeadm init --apiserver-advertise-address=192.168.122.2 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

参数解释:

  • --apiserver-advertise-address: k8s 中的主要服务apiserver的部署地址,填自己的管理节点 ip
  • --image-repository: 拉取的 docker 镜像源,因为初始化的时候kubeadm会去拉 k8s 的很多组件来进行部署,所以需要指定国内镜像源,下不然会拉取不到镜像。
  • --pod-network-cidr: 这个是 k8s 采用的节点网络,因为我们将要使用flannel作为 k8s 的网络,所以这里填10.244.0.0/16就好
  • --kubernetes-version: 这个是用来指定你要部署的 k8s 版本的,一般不用填,不过如果初始化过程中出现了因为版本不对导致的安装错误的话,可以用这个参数手动指定。
  • --gnore-preflight-errors: 忽略初始化时遇到的错误,比如说我想忽略 cpu 数量不够 2 核引起的错误,就可以用--ignore-preflight-errors=CpuNum。错误名称在初始化错误时会给出来。

执行上面的命令,等待安装完成,知道出现下面的文字表示安装成功

Your Kubernetes control-plane 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/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.122.2:6443 --token 1gyku3.72jgt8prrp2fdhhx \
    --discovery-token-ca-cert-hash sha256:9c5bf462c308be3a69b6766e71f367e48e222c4ee019c4ec438e02e089ab4e12

复制保存kubeadm join那行的文字,后面添加节点需要使用到,注意,token默认是24小时会过期,可以在master上利用如下命令查看token是否有效

kubeadm token list

如果没有有效token,可以重新创建一个

kubeadm token create

初始化kubectl工具

按照kubeadm的指示操作就行,依次执行如下命令,用普通用户的账号

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

如果你想在root用户下使用

export KUBECONFIG=/etc/kubernetes/admin.conf

部署flannel (Pod Network Adds-on)

k8s依赖于第三的节点网络,以便各pod节点之间可以相互通信

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

如果遇到timeout错误,请使用代理

输出以下内容代表安装完成

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

添加node节点

按照最前面的部署安装好k8s相关程序

kubeadm join 192.168.122.2:6443 --token 1gyku3.72jgt8prrp2fdhhx \
    --discovery-token-ca-cert-hash sha256:9c5bf462c308be3a69b6766e71f367e48e222c4ee019c4ec438e02e089ab4e12

如果join命令忘记了复制,可以去master节点上执行

kubeadm token create --print-join-command

详细安装日志

可以通过在命令后面增加--v=5来查看详细安装日志,例如

kubeadm join 192.168.122.2:6443 --token 1gyku3.72jgt8prrp2fdhhx \
    --discovery-token-ca-cert-hash sha256:9c5bf462c308be3a69b6766e71f367e48e222c4ee019c4ec438e02e089ab4e12 --v=5

安装完成

主节点执行kubectl get nodes -o wide,检查各节点是否为Ready状态

ubuntu@k8s-master:~$ kubectl get nodes -o wide
NAME          STATUS   ROLES    AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
k8s-master    Ready    master   23d   v1.16.2   192.168.122.2     <none>        Ubuntu 16.04.6 LTS   4.4.0-142-generic   docker://18.6.0
k8s-node-01   Ready    <none>   23d   v1.16.2   192.168.122.101   <none>        Ubuntu 16.04.6 LTS   4.4.0-142-generic   docker://18.6.0
k8s-node-02   Ready    <none>   23d   v1.16.2   192.168.122.102   <none>        Ubuntu 16.04.6 LTS   4.4.0-142-generic   docker://18.6.0