Kubernetes部署篇:Kubespray方式自动化

众所周知Kubernetes集群的部署比较繁琐复杂,这里列出常见的几种部署方式及过程.

官方现在提供2种主要的部署方式:

  • Kubespray : 基于Ansible的集群自动化部署,支持的平台更广泛,部署更灵活
  • Kubernetes Operations (kops): 生产环境集群自动化部署工具, 目前只支持AWS, GCE云环境.

Kubernetes部署/运行结构

Control Plane

包括三部分组件:

  • apiServer
  • controllerManager
  • scheduler

kube-controller-manager实例:
管理controller状态的守护进程,包括replication controller, endpoints controller, namespace controller, serviceaccounts controller.

组件安装顺序

  • Docker
  • etcd
  • kubelet and kube-proxy
  • network_plugin (such as Calico or Weave)
  • kube-apiserver, kube-scheduler, and kube-controller-manager
  • Add-ons (such as KubeDNS)

高可用

Control Plane和ETCD至少需要3个节点,才可提供HA.

添加 –experimental-control-plane 选项组成control plane集群.

Kubespray部署实战

说明

由于国内网络访问docker.com及镜像, kubernates, gcr.io等相关镜像极不稳定,替换了相关安装源.

这里使用的是我的Kubespray(已更新至2018.12最新版v2.8.0) fork版本

部署节点前提

cp inventory/sample inventory/mycluster

根据自己的节点信息修改inventory/mycluster/hosts.ini

我的例子

moon1 ansible_ssh_host=10.20.30.101  
moon2 ansible_ssh_host=10.20.30.102 
moon3 ansible_ssh_host=10.20.30.103
moon4 ansible_ssh_host=10.20.30.104 
moon5 ansible_ssh_host=10.20.30.105 
moon6 ansible_ssh_host=10.20.30.106 

[kube-master]
moon1
moon2

[etcd]
moon1
moon2
moon3

[kube-node]
moon2
moon3
moon4
moon5
moon6

[k8s-cluster:children]
kube-master
kube-node

国内镜像及加速的常见步骤

已包含于Ansible运行脚本.

docker 阿里云镜像

    # step 1: 安装必要的一些系统工具
    sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
    # step 2: 安装GPG证书
    curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    # Step 3: 写入软件源信息
    sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    # Step 4: 更新并安装 Docker-CE
    sudo apt-get -y update
    # 查找Docker-CE的版本: apt-cache madison docker-ce
    # 安装指定版本的Docker-CE
     sudo apt-get -y install docker-ce=17.03.2~ce-0~ubuntu-xenial

docker镜像 阿里云加速

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://nz4awhki.mirror.aliyuncs.com"]
    }
    EOF
    # 重启以生效
    sudo service docker restart

kubernetes镜像

    cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
    deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
    EOF

gcr.io和quay.io镜像

将相关镜像URL里

  • gcr.io部分替换为gcr.mirrors.ustc.edu.cn
  • quay.io部分替换为quay.mirrors.ustc.edu.cn

注1: 国内网络的问题也可以通过手动下载相关镜像并重新tag的方式解决. 注2: gcr.io的镜像列表见 官方网站

运行Ansible Playbook命令

首次运行,建议:

  1. 开启详情日志: -v

  2. 如果非root,切换sudo用户: -u xulz -b

  3. 建议先运行其中一台节点: –limit moon1

ansible-playbook -u xulz -b -i inventory/mycluster/hosts.ini cluster.yml --limit moon1

# 如果某步骤出错,建议修复后先重试错误,在以上命令后添加
--limit @/Users/xulz/k8s/kubespray/cluster.retry

删除节点

ansible-playbook -u xulz -b -i inventory/mycluster/hosts.ini remove-node.yml --limit moon11

添加节点

ansible-playbook -u xulz -b -i inventory/mycluster/hosts.ini scale.yml

升级节点

ansible-playbook -u xulz -b -i inventory/mycluster/hosts.ini upgrade-cluster.yml

问题排查

如果ansible运行失败,根据最后的控制台错误做相应的修正并重试.

日志的存放位置为节点主机的: /var/log/containers/

注: 如果以–check的Dry Run方式运行,会造成运行错误(因为脚本依赖于某些步骤的实际运行结果为环境变量),所以不要使用这种模式.

运行kubectl xxx命令报错: The connection to the server localhost:8080 was refused - did you specify the right host or port?

解决方式: 添加 KUBECONFIG 环境变量

vi ~/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf

在准备阶段报错: “assertion”: “ansible_swaptotal_mb == 0”

解决方式: 需要关闭swap

sudo swapoff -a

运行kubectl 命令报错: Unable to connect to the server: x509: certificate is valid for …, not …

解决方式: 参考Invalid x509 certificate for kubernetes master

如果升级cluster出错,建议逐个命令调试.

sudo kubeadm upgrade plan

# 参考下面的扩展阅读部分 

登录Kubernetes Dashboard

    ### 创建管理员账号
    kubectl create -f admin-role.yaml
    # 找到admin-token开头的token名字
    kubectl  -n kube-system get secret
    # 获取相应的token
    kubectl -n kube-system get secret admin-token-tmh9v -o jsonpath={.data.token}|base64 -d
    # 也可以直接运行 kubectl -n kube-system describe secret admin-token-tmh9v 获取token
    
    # 访问网址: https://<first_master>:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login
    # 选择以token方式登录, 输入上一步获取的token
    # 登录成功

admin-role.yaml的具体内容见这里

关于Dashboard的说明

Dashborad支持token和kubeconfig两种认证登录方式,而kubeconfig的方式也需要token字段。

默认命名空间有: default, kube-public, kube-system

扩展阅读