一键部署K8S单master集群

一 一键部署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
  • 系统初始化
  1. 关闭selinux,firewalld
  2. 关闭swap
  3. 时间同步(如没网,需手动同步)
  4. 写hosts
  • Etcd集群部署
  1. 生成etcd证书
  2. 部署三个etcd集群
  3. 查看集群状态
  • 部署Master
  1. 生成apiserver证书
  2. 部署apiserver、controller-manager和scheduler组件
  3. 启动TLS Bootstrapping
  • 部署Node
  1. 安装Docker
  2. 部署kubelet和kube-proxy
  3. 在Master上允许为新Node颁发证书
  4. 授权apiserver访问kubelet
  • 部署插件(准备好镜像)
  1. Flannel
  2. Web UI
  3. CoreDNS
  4. 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('.') }}
  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值