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命令
首次运行,建议:
-
开启详情日志: -v
-
如果非root,切换sudo用户: -u xulz -b
-
建议先运行其中一台节点: –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
扩展阅读
- Kubernetes The Hard Way: 例子基于GCP(Google Cloud Platform)
- kubespray官网
- Kubernetes - Upgrading Cluster