k8s安装

首先需要完成对k8s的安装,k8s 的安装方式基本有2种;kubeadm工具安装和二进制文件方式安装

因为k8s的安装比较复杂 且容易出错,Kubernetes从1.4版本开始引入了命令行工具kubeadm,方便快速安装k8s.

下面会分别说明2种k8s的安装方式;

k8s的集群架构模式

k8s的集群架构 分为单master 和多master。对于node 一般肯定是多个的,而master可以1个或多个。当然为了高可用,可以选用多master的架构。但是多master架构的模式下,多个work node 需要一个负载均衡器来访问多个master.

k8s生产环境的要求配置说明

本次安装环境配置说明

k8s 支持多种容器引擎这里以docker来做说明

系统版本 centos7

虚拟机 3 台 配置 2core * 2G

docker版本 18.06.1-ce

k8s 版本 1.18.0

安装前的准备

安装k8s之前需要对linux系统做一些设置

  1. 主机上禁用SELinux,让容器可以读取主机文件系统

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config  
    需要重启


    > setenforce 0 # 临时

    验证成功:getenforce
    Enforcing是开启状态
          Permissive 是临时禁用了(警告模式,将该事件记录下来,依然允许执行)
          disable 永久禁用了
  2. 关闭防火墙,因集群环境设计到多个端口通信,在安全的内网中可以选择关闭

    1
    2
    > systemctl stop firewalld
    > systemctl disable firewalld
  3. 关闭swap

1
2
> vim /etc/fstab #编辑文件然后将swap 注释了就关闭了swap了  或执行命令  sed -ri 's/.*swap.*/#&/' /etc/fstab   
> swapoff -a 临时

执行free -m 看是否都为0 ,如果都为0 表示已经关闭了;

  1. 同步系统时间,防止因时间不一致导致的问题

    1
    2
    3
    # 时间同步
    yum install ntpdate -y
    ntpdate time.windows.com

使用 kubeadm 工具安装

kubeadm 是官方提供的一个快速部署集群的工具。

主要的命令有 kubeadm init 初始化master节点

​ kubeadm join (mater address) work node 加入到master节点上

三台虚拟机机器的ip

master 192.168.199.113

node1 192.168.199.114

node2 192.168.199.115

  1. 为主机设置hostname(三台分别执行 )

    分别再三台主机设置hostname

    1
    2
    3
    hostnamectl set-hostname master
    hostnamectl set-hostname node1
    hostnamectl set-hostname node2
  2. 进入master主机 113的那台添加host映射和上面设置的hostname要一致

    1
    2
    3
    4
    5
    cat >> /etc/hosts << EOF
    192.168.199.113 master
    192.168.199.114 node1
    192.168.199.115 node2
    EOF
  3. 将桥接的IPv4流量传递到iptables的链 (三台都执行相同的)

1
2
3
4
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
1
sysctl --system  # 生效
  1. 禁用swap

    1
    2
    swapoff -a  # 临时
    sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
  2. 安装docker环境

    下载docker的yum 镜像源

    1
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
    1
    如果没有wget命令使用yum安装   yum install wget -y

    yum安装docker

    1
    yum -y install docker-ce-18.06.1.ce-3.el7

    启动docker服务

    1
    systemctl enable docker && systemctl start docker

    验证安装是否成功

    1
    docker --version

    配置可用的docker镜像源

    1
    2
    3
    4
    5
    cat > /etc/docker/daemon.json << EOF
    {
    "registry-mirrors": ["https://reg-mirror.qiniu.com"]
    }
    EOF

​ 重启docker

  
1
systemctl restart docker

使用docker info 查看是否生效

  1. 添加k8s的yum镜像源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
  2. 安装kubeadm,kubelet和kubectl

    yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

    systemctl enable kubelet

  1. ~初始化k8s master 节点

    在master主机上执行

    1
    2
    3
    4
    5
    6
    kubeadm init \
    --apiserver-advertise-address=192.168.199.113 \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version v1.18.0 \
    --service-cidr=10.96.0.0/12 \
    --pod-network-cidr=10.244.0.0/16

    apiserver-advertise-address master节点的地址

    image-repository 镜像的仓库地址

    kubernetes-version k8s版本号

    service-cidr 服务的网段信息

    pod-network-cidr pod的网段信息(不能和上面的相同)

    在完成后会生成一个包含token的连接信息 ,其他的节点执行此命令就可以连接到master.

    或者使用命令打印这个token 信息,token的有效期是24h

    1
    kubeadm token create --print-join-command

    打印连接命令信息

    接着执行命令生成配置文件等信息!

    根据提示在master节点执行命令

    1
    2
    3
    4
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    kubectl get nodes

    可以使用docker images 看到拉取到的镜像信息;

    docker ps 查看正在运行的容器信息

  2. node 加入master节点

    分别在所有的非master节点上执行

    1
    kubeadm join 192.168.199.113:6443 --token vv1m2b.vcvfi5pbe1qmaz3u     --discovery-token-ca-cert-hash sha256:60cd6c9471f3cb4c8d84510091a1cd9649163c0a236255816eb923d2f21e482f 

  3. 安装CNI(container network interface) 网络组件,只有安装了网络组件才能进行连通,才能正常的工作

    k8s 服务并不包含网络的相关组件的安装,而是通过CNI的方式可以使用多种网络服务组件,比较常用的有 Flannel、Calico、Weave、Canal;

    这里使用 Flannel 网络组件,当然也可以选用其他的网络组件;

    master节点执行

    1
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    1
    kubectl get pods -n kube-system

此文件如果无法访问,可以先下载下来再放到服务器上执行

  1. 查看状态和测试是否成功

    1
    2
    3
    4
    5
    6
    7
    8
    查看node 状态

    [root@master ~]# kubectl get nodes
    NAME STATUS ROLES AGE VERSION
    master Ready master 21h v1.18.0
    node1 Ready <none> 21h v1.18.0
    node2 Ready <none> 21h v1.18.0

    部署nginx

    1
    2
    3
    4
    5
    6
    #创建一个镜像为nginx的部署
    kubectl create deployment nginx --image=nginx
    #暴露部署node
    kubectl expose deployment nginx --port=80 --type=NodePort
    #获取pod的详细信息
    kubectl get pod -o wide
    1
    2
    //执行
    kubectl get service
    1
    2
    3
    4
    NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22h
    nginx NodePort 10.104.147.153 <none> 80:30255/TCP 3m54s

    那么使用: http:nodeIp:30255 即可映射到nginx的80端口

    nodeIp 可以是集群中的任何一个物理Ip

安装中的问题

  1. 重启后docker启动错误

    1
    2
    Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

    docker服务无法启动,大概率是 /etc/docker/daemon.json 此文件有问题;

    • 检查此文件的内容和格式
    • 检查此文件的读写权限
  2. 安装完毕CNI 网络后,有服务一直是pending 状态

kubectl get pods -A -o wide 查看详细的信息;

执行机器重启,全部重新启动,就可以了

查看具体对应的pod状态

1
kubectl describe pod -n kube-system kube-flannel-ds-amd64-c4h6p

​ 内部可以看到对应的镜像,可以先手动拉取镜像

​ 手动拉取完镜像后;

​ 重新安装CNI

​ 首先执行删除flannel

1
kubectl delete -f kube-flannel.yml

强制删除未运行的pod 删除

1
2
3
4
kubectl delete pod  kube-flannel-ds-4wjrw --force --grace-period=0 -n kube-system 
kubectl delete pod kube-flannel-ds-wjzll --force --grace-period=0 -n kube-system
kubectl delete pod kube-proxy-xm4w2 --force --grace-period=0 -n kube-system

然后再安装

1
kubectl apply -f kube-flannel.yml

发现仍然是pending状态;

  1. 节点 NotReady 问题

node1 和node2 都是notReady 状态

1
2
3
4
5
6
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 29h v1.18.0
node1 NotReady <none> 28h v1.18.0
node2 NotReady <none> 28h v1.18.0

​ 使用 kubeadm reset 命令将安装重置,重新初始化

​ rm -rf $HOME/.kube

​ 4.Failed to start ContainerManager failed to initialize top level QOS containers

​ 出现node 节点上的kubelet 无法启动;

​ 解决方式:

​ 执行

​ 参考链接 http://www.ichenfu.com/2019/12/06/kubelet-failed-to-initialize-top-level-qos-containers/