一 一键部署k8s单master集群
1.1 集群规划
ip | 角色 | 组件 |
---|---|---|
172.17.239.248 | k8s-master | kube-apiserver kube-controller-manager kube-scheduler etcd |
172.17.239.251 | k8s-node1 | kubelet kube-proxy docker etcd |
172.17.239.252 | k8s-node2 | kubelet kube-proxy docker etcd |
- 系统初始化
- 关闭selinux,firewalld
- 关闭swap
- 时间同步(如没网,需手动同步)
- 写hosts
- Etcd集群部署
- 生成etcd证书
- 部署三个etcd集群
- 查看集群状态
- 部署Master
- 生成apiserver证书
- 部署apiserver、controller-manager和scheduler组件
- 启动TLS Bootstrapping
- 部署Node
- 安装Docker
- 部署kubelet和kube-proxy
- 在Master上允许为新Node颁发证书
- 授权apiserver访问kubelet
- 部署插件(准备好镜像)
- Flannel
- Web UI
- CoreDNS
- Ingress-Controller
1.2 目录结构
k8s/ # k8s项目
├── ansible.cfg # 配置文件
├── group_vars # 存放组变量的目录
│ └── all.yml
├── hosts # hosts清单文件
├── roles # 存放模块的目录,比如ansible-galaxy init common
└── single-master.yml # 部署文件
1.3 common文件编写
全局变量文件
# 安装目录
software_dir: '/root/binary_pkg'
k8s_work_dir: '/opt/kubernetes'
etcd_work_dir: '/opt/etcd'
tmp_dir: '/tmp/k8s'
# 集群网络
service_cidr: '10.0.0.0/24'
cluster_dns: '10.0.0.2' # 与roles/addons/files/coredns.yaml中IP一致,并且是service_cidr中的IP
pod_cidr: '10.244.0.0/16' # 与roles/addons/files/kube-flannel.yaml中网段一致
service_nodeport_range: '30000-32767'
cluster_domain: 'cluster.local'
# 自签证书可信任IP列表,为方便扩展,可添加多个预留IP
cert_hosts:
# 包含所有LB、VIP、Master IP和service_cidr的第一个IP
k8s:
- 10.0.0.1
- 172.17.239.251
- 172.17.239.248
- 172.17.239.252
# 包含所有etcd节点IP
etcd:
- 172.17.239.251
- 172.17.239.248
- 172.17.239.252
全局需要的软件包
# ll -h /root/binary_pkg
total 505M
-rw-r--r-- 1 root root 5.6M Nov 25 06:36 cfssl.tar.gz
-rw-r--r-- 1 root root 35M Aug 15 2019 cni-plugins-linux-amd64-v0.8.2.tgz
-rw-r--r-- 1 root root 46M Jun 25 2019 docker-18.09.6.tgz
-rw-r--r-- 1 root root 10M Jun 9 2019 etcd-v3.3.13-linux-amd64.tar.gz
-rw-r--r-- 1 root root 9.2M Jun 9 2019 flannel-v0.11.0-linux-amd64.tar.gz
-rw-r--r-- 1 root root 2.5M Nov 30 18:27 ha.tar.gz
-rw-r--r-- 1 root root 268M Nov 9 20:17 image.tar.gz
-rw-r--r-- 1 root root 129M Nov 9 19:55 kubernetes-server-linux-amd64-1.16.tar.gz
========================================================================================
common文件用来关闭防火墙、selinux等等。
- 编写common任务文件
# vim roles/common/tasks/main.yml
---
# 这个剧本在所有节点上运行
- name: 关闭firewalld
service: name=firewalld state=stopped enabled=no
- name: 关闭selinux
lineinfile:
dest: /etc/selinux/config
regexp: "^SELINUX="
line: "SELINUX=disabled"
- name: 关闭swap
lineinfile:
dest: /etc/fstab
regexp: "UUID.*swap"
line: ""
- name: 即时生效
shell: setenforce 0 ; swapoff -a
- name: 拷贝时区
copy: src=/usr/share/zoneinfo/Asia/Shanghai dest=/etc/localtime
- name: 添加hosts
template: src=hosts.j2 dest=/etc/hosts
#- name: 同步系统时间
# yum: name=ntpdate state=present
#- name: 同步系统时间
- 上面用到了hosts.j2模板文件,该文件用到了组变量k8s如下
# vim roles/common/templates/hosts.j2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
{
% for host in groups['k8s'] %}
{
{
hostvars[host].inventory_hostname }} {
{
hostvars[host].node_name }}
{
% endfor %}
# vim hosts
[master]
172.17.239.248 node_name=k8s-master
[node]
172.17.239.251 node_name=k8s-node1
172.17.239.252 node_name=k8s-node2
[k8s:children]
master
node
[etcd]
172.17.239.248 etcd_name=etcd-1
172.17.239.251 etcd_name=etcd-2
172.17.239.252 etcd_name=etcd-3
- 编写可执行文件
# vim single-master.yml
---
- name: 0.系统初始化
gather_facts: false
hosts:
- k8s
roles:
- common
tags: common
- 运行后检查配置是否正确,若正确后续会按照这种方式增加相关的模块和变量到k8s目录下
# ansible-playbook -i hosts single-master.yml -t "common"
# cat /etc/hosts # ansible使用已经生效
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.17.239.248 k8s-master
172.17.239.251 k8s-node1
172.17.239.252 k8s-node2
1.4 etcd与k8s证书准备
- 初始化tls、etcd、master、node模块,tls证书通过脚本复制到etcd、master、node的files目录
# ansible-galaxy init roles/tls
# ansible-galaxy init roles/master
# ansible-galaxy init roles/node
任务文件解析
- root_dir 指的是存放hosts的目录,必须在该目录运行ansible-playbook
- 会在{ { root_dir.stdout }}/ssl/生成etcd、k8s目录
- { { software_dir }} 该变量存放在全局组变量中,这个目录有我们准备好的软件包, 上面有说明
- 生成证书配置文件到 { { root_dir.stdout }}/ssl/k8s/
- 运行脚本,该脚本进入{ { root_dir.stdout }}/ssl/{etcd,k8s}目录,生成证书并把证书复制到master、node节点的roles/{master,node}/files/ 目录,以供master、node模块直接使用
# vim roles/tls/tasks/mail.yml
---
- name: 获取Ansible工作目录
shell: pwd |sed 's#roles/tls##'
register: root_dir
- name: 创建工作目录
file: dest={
{
root_dir.stdout }}/ssl/{
{
item }} state=directory
with_items:
- etcd
- k8s
- name: 准备cfssl工具
unarchive: src={
{
software_dir }}/cfssl.tar.gz dest=/usr/bin/ mode=u+x
- name: 准备etcd证书请求文件
template: src=etcd/{
{
item }} dest={
{
root_dir.stdout }}/ssl/etcd/{
{
item.split('.')[:-1]|join('.') }}
with_items:
- ca-config.json.j2
- ca-csr.json.j2
- server-csr.json.j2
- name: 准备生成etcd证书脚本
copy: src=generate_etcd_cert.sh dest={
{
root_dir.stdout }}/ssl/etcd mode=u+x
- name: 生成etcd证书
shell: cd {
{
root_dir.stdout }}/ssl/etcd && /bin/bash generate_etcd_cert.sh
- name: 准备k8s证书请求文件
template: src=k8s/{
{
item }} dest={
{
root_dir.stdout }}/ssl/k8s/{
{
item.split('.')[:-1]|join('.') }}