一、利用ansible部署kubernetes准备:

集群介绍

本系列文档致力于提供快速部署高可用k8s集群的工具,并且也努力成为k8s实践、使用的参考书;基于二进制方式部署和利用ansible-playbook实现自动化:既提供一键安装脚本,也可以分步执行安装各个组件,同时讲解每一步主要参数配置和注意事项;二进制方式部署有助于理解系统各组件的交互原理和熟悉组件启动参数,有助于快速排查解决实际问题。



版本组件



kubernetes v1.9.7



etcd v3.3.4



docker 18.03.0-ce



calico/node:v3.0.6



calico/cni:v2.0.5



calico/kube-controllers:v2.0.4



centos 7.3+



 



集群规划和基础参数设定



1、高可用集群所需节点配置如下:

  • 部署节点 x1 : 运行这份 ansible 脚本的节点  # 部署节点:运行ansible 脚本的节点
  • etcd节点 x3 : 注意etcd集群必须是1,3,5,7...奇数个节点
  • master节点 x1 : 运行集群主要组件
  • node节点 x3 : 真正应用部署的节点,根据需要增加机器配置和节点数

2、在部署节点准备ansible:使用ansible的doker环境启动

(1)下载内部源配置脚本





 



(2)下载并安装docker



wget download.yunwei.edu/shell/docker.tar.gz


ls



tar zxvf docker.tar.gz



ls



cd docker/



ls



sh docker.sh



systemctl status docker



docker images





 



(3)下载并运行docker版ansible



docker pull reg.yunwei.edu/learn/ansible:alpine3



docker run -itd -v /etc/ansible:/etc/ansible -v /etc/kubernetes/:/etc/kubernetes/ -v /root/.kube:/root/.kube -v /usr/local/bin/:/usr/local/bin/ 1acb4fd5df5b  /bin/sh



 



(4)配置每台机器之间主机名解析以及免密钥登陆




 



配置免密登录



#ssh-keygen  回车 回车 回车



#ssh-copy-id $Ips   #$IPs为所有节点地址包括自身,按照提示输入yes 和root密码



(5)下载安装kubernetes




k8s redis集群 pvc k8s集群部署_运维


 


 


k8s redis集群 pvc k8s集群部署_k8s redis集群 pvc_02


 


 


k8s redis集群 pvc k8s集群部署_ico_03


 


 


k8s redis集群 pvc k8s集群部署_k8s redis集群 pvc_04


 


k8s redis集群 pvc k8s集群部署_运维_05


 


解压 二进制文件包:k8s197.tar.gz,之后将解压后的 bin 目录下的所有二进制文件 mv 到 /etc/ansible/bin/下


k8s redis集群 pvc k8s集群部署_运维_06


 


解压后会产生一个bin目录,该目录为docker和kubernetes的环境目录,如果该目录下的文件无法共享到集群中的节点,docker与kubectl命令不可用


k8s redis集群 pvc k8s集群部署_k8s redis集群 pvc_07


 


 


k8s redis集群 pvc k8s集群部署_开发工具_08


 


将example目录中的模板文件导出,复制到/etc/ansible目录下,并改名为hosts


k8s redis集群 pvc k8s集群部署_k8s redis集群 pvc_09


 


k8s redis集群 pvc k8s集群部署_运维_10


 


[deploy]
192.168.254.20
 
# etcd集群请提供如下NODE_NAME、NODE_IP变量,请注意etcd集群必须是1,3,5,7...奇数个节点
[etcd]
192.168.254.21 NODE_NAME=etcd1 NODE_IP="192.168.254.21"
192.168.254.22 NODE_NAME=etcd2 NODE_IP="192.168.254.22"
192.168.254.23 NODE_NAME=etcd3 NODE_IP="192.168.254.23"
 
[kube-master]
192.168..254.21 NODE_IP="192.168..254.21"
 
[kube-node]
192.168.254.21 NODE_IP="192.168.254.21"
192.168.254.22 NODE_IP="192.168.254.22"
192.168.254.23 NODE_IP="192.168.254.23"
 
[all:vars]
# ---------集群主要参数---------------
#集群部署模式:allinone, single-master, multi-master
DEPLOY_MODE=single-master
 
#集群 MASTER IP
MASTER_IP="192.168.254.21"
 
#集群 APISERVER
KUBE_APISERVER="https://192.168.254.21:6443"
 
#TLS Bootstrapping 使用的 Token,使用 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
BOOTSTRAP_TOKEN="d18f94b5fa585c7123f56803d925d2e7"
 
# 集群网络插件,目前支持calico和flannel         calico工作在第三层 flannel工作在第二层
CLUSTER_NETWORK="calico"
 
# 部分calico相关配置,更全配置可以去roles/calico/templates/calico.yaml.j2自定义
# 设置 CALICO_IPV4POOL_IPIP=“off”,可以提高网络性能,条件限制详见 05.安装calico网络组件.md
CALICO_IPV4POOL_IPIP="always"
# 设置 calico-node使用的host IP,bgp邻居通过该地址建立,可手动指定端口"interface=eth0"或使用如下自动发现
IP_AUTODETECTION_METHOD="can-reach=223.5.5.5"
 
# 部分flannel配置,详见roles/flannel/templates/kube-flannel.yaml.j2
FLANNEL_BACKEND="vxlan"
 
# 服务网段 (Service CIDR),部署前路由不可达,部署后集群内使用 IP:Port 可达
SERVICE_CIDR="10.68.0.0/16"
 
# POD 网段 (Cluster CIDR),部署前路由不可达,**部署后**路由可达
CLUSTER_CIDR="172.20.0.0/16"
 
# 服务端口范围 (NodePort Range)
NODE_PORT_RANGE="20000-40000"
 
# kubernetes 服务 IP (预分配,一般是 SERVICE_CIDR 中第一个IP)
CLUSTER_KUBERNETES_SVC_IP="10.68.0.1"
 
# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
CLUSTER_DNS_SVC_IP="10.68.0.2"
 
# 集群 DNS 域名
CLUSTER_DNS_DOMAIN="cluster.local."
 
# etcd 集群间通信的IP和端口, **根据实际 etcd 集群成员设置**
ETCD_NODES="etcd1=https://192.168.254.21:2380,etcd2=https://192.168.254.22:2380,etcd3=https://192.168.254.23:2380"
 
# etcd 集群服务地址列表, **根据实际 etcd 集群成员设置**
ETCD_ENDPOINTS="https://192.168.254.21:2379,https://192.168.254.22:2379,https://192.168.254.23:2379"
 
# 集群basic auth 使用的用户名和密码
BASIC_AUTH_USER="admin"
BASIC_AUTH_PASS="admin"
 
# ---------附加参数--------------------
#默认二进制文件目录
bin_dir="/usr/local/bin"
 
#证书目录
ca_dir="/etc/kubernetes/ssl"
 
#部署目录,即 ansible 工作目录
base_dir="/etc/ansible"


 


 


k8s redis集群 pvc k8s集群部署_运维_11


 


#ssh-keygen  回车 回车 回车


#ssh-copy-id $Ips   #$IPs为所有节点地址包括自身,按照提示输入yes 和root密码


测试各节点是否正常


k8s redis集群 pvc k8s集群部署_运维_12


 


1、


  • 创建CA证书和环境配置
  • 主要完成CA证书创建、分发、环境变量。
  • kubernetes 系统各组件需要使用 TLS 证书对通信进行加密,使用 CloudFlare 的  PKI 工具集生成自签名的CA证书,用来签名后续创建的其它 TLS 证书。


k8s redis集群 pvc k8s集群部署_运维_13


 


2、安装etcd集群


3、安装docker服务


安装kube-master节点


部署master节点包含三个组件`apiserver` `scheduler` `controller-manager`,其中:


apiserver:提供集群管理的REST API接口,包括认证授权、数据校验以及集群状态变更等


  • 只有API Server才直接操作etcd
  • 其他模块通过API Server查询或修改数据
  • 提供其他模块之间的数据交互和通信的枢纽

scheduler:负责分配调度Pod到集群内的node节点


  • 监听kube-apiserver,查询还未分配Node的Pod
  • 根据调度策略为这些Pod分配节点

controller-manager:由一系列的控制器组成,它通过apiserver监控整个集群的状态,并确保集群处于预期的工状态


#ansible-playbook 04.kube-master.yml


 


5、


安装kube-node节点


node 是集群中承载应用的节点,前置条件需要先部署好master节点(因为需要操作用户角色绑定、批准kubelet TLS 证书请求等),它需要部署如下组件:


  • docker:运行容器
  • calico: 配置容器网络
  • kubelet: node上最主要的组件
  • kube-proxy: 发布应用服务与负载均衡


6、安装网络


k8s redis集群 pvc k8s集群部署_shell_14


 


将镜像文件拷贝到各个节点,并运行容器


k8s redis集群 pvc k8s集群部署_shell_15


 


k8s redis集群 pvc k8s集群部署_开发工具_16


 


k8s redis集群 pvc k8s集群部署_shell_17


 


k8s redis集群 pvc k8s集群部署_开发工具_18


 


测试:


k8s redis集群 pvc k8s集群部署_开发工具_19


 


k8s redis集群 pvc k8s集群部署_ico_20


 


验证calico网络


k8s redis集群 pvc k8s集群部署_运维_21


 


 部署coredns服务


(1)进入/etc/ansible/manifests 目录:



 


(2)进入coredns工作目录,并创建pod:


 


k8s redis集群 pvc k8s集群部署_ico_22


 


验证coredns:



在集群中任意节点都能ping通pod服务IP



 


部署dashboard


(1)进入dashboard工作目录,并创建pod:


 


k8s redis集群 pvc k8s集群部署_ico_23


 


(2)验证dashboard:



 


(3)查看 dashboard 服务端点,并登陆:


 


k8s redis集群 pvc k8s集群部署_开发工具_24


 


将dashboard 服务端点复制到浏览器并打开(用户名/密码:admin/admin)



 



需要输入 Token 方可登陆,获取 Token:


#kubectl -n kube-system describe secret $(kubectl -n kube-system get secret|grep admin-user|awk '{print $1}')


 


k8s redis集群 pvc k8s集群部署_开发工具_25


 


登陆成功:



 


部署heapster监控

(1)进入heapster工作目录,并创建pod:

(2)验证监控:

 

 

 yaml文件

 vim 01.prepare.yml

 

# 在deploy节点生成CA相关证书,以及kubedns.yaml配置文件
- hosts: deploy
  roles:
  - deploy

# 集群节点的公共配置任务
- hosts:
  - kube-master
  - kube-node
  - deploy
  - etcd
  - lb
  roles:
  - prepare

# [可选]多master部署时的负载均衡配置
- hosts: lb
  roles:
  - lb


 


 vim   02.etcd.yml


- hosts: etcd
  roles:
  - etcd


vim 03.docker.yml


- hosts:
  - kube-master
  - kube-node
  roles:
  - docker


vim 04.kube-master.yml


- hosts: kube-master
  roles:
  - kube-master
  - kube-node
  # 禁止业务 pod调度到 master节点
  tasks:
  - name: 禁止业务 pod调度到 master节点
    shell: "{{ bin_dir }}/kubectl cordon {{ NODE_IP }} "
    when: DEPLOY_MODE != "allinone"
    ignore_errors: true


vim 05.kube-node.yml


- hosts: kube-node
  roles:
  - kube-node


vim 06.network.yml


 

# 集群网络插件部署,只能选择一种安装
- hosts:
  - kube-master
  - kube-node
  roles:
  - { role: calico, when: "CLUSTER_NETWORK == 'calico'" }
  - { role: flannel, when: "CLUSTER_NETWORK == 'flannel'" }


 

 

k8s redis集群 pvc k8s集群部署_ico_26


 


vim main.yml


- name: 创建calico 相关目录
  file: name={{ item }} state=directory
  with_items:
  - /etc/calico/ssl
  - /opt/kube/kube-system/calico

- name: 复制CA 证书到calico 证书目录
  copy: src={{ ca_dir }}/ca.pem dest=/etc/calico/ssl/ca.pem

- name: 创建calico 证书请求
  template: src=calico-csr.json.j2 dest=/etc/calico/ssl/calico-csr.json

- name: 创建 calico证书和私钥
  shell: "cd /etc/calico/ssl && {{ bin_dir }}/cfssl gencert \
        -ca={{ ca_dir }}/ca.pem \
        -ca-key={{ ca_dir }}/ca-key.pem \
        -config={{ ca_dir }}/ca-config.json \
        -profile=kubernetes calico-csr.json | {{ bin_dir }}/cfssljson -bare calico"

# 因官方calico.yaml文件中使用特定的证书名,所以要重命名
- name: 重命名相关证书
  shell: "cd /etc/calico/ssl && cp ca.pem etcd-ca && cp calico.pem etcd-cert && cp calico-key.pem etcd-key"

- name: 准备 calico DaemonSet yaml文件
  template: src=calico.yaml.j2 dest=/opt/kube/kube-system/calico/calico.yaml


具体的ansible文件配置,见百度网盘kubernetes.tar.gz