文章目录
Intro
测试来自大佬的 github:https://github.com/gjmzj/kubeasz
测试场景
针对大佬的 github 做了削微的调整,在运维场景中,一般用 sudo 账户进行部署会比较常用。不过要改的地方的确有点多==。
另外增加一个前置 task,完成免密的部分。
# 00-deploy-ssh_key.yml
---
- hosts: deploy
tasks:
- name: Generate SSH keys
shell: ssh-keygen -b 2048 -t rsa -N "" -f /home/{{ ansible_user }}/.ssh/id_rsa -q
args:
creates: /home/{{ ansible_user }}/.ssh/id_rsa
- name: Fetch SSH keys
fetch:
src: /home/{{ ansible_user }}/.ssh/id_rsa.pub
dest: generate_ssh_key/files/
flat: yes
- hosts: all
tasks:
- name: ssh-copy-id
authorized_key: user={{ ansible_user }} key="{{ lookup('file', 'generate_ssh_key/files/id_rsa.pub') }}" state=present
- hosts: all
become: true
become_method: sudo
tasks:
- name: sudo without password
shell: "echo '{{ ansible_user }} ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers"
部署的时候,调用命令相同,只是 hosts 文件会有不同。
ansible-playbook -i hosts -e ansible_user=badao -e ansible_password=123 -e ansible_sudo_pass=123 00-deploy-ssh_key.yml --ask-vault
ansible-playbook -i hosts 90.setup.yml -e ansible_user=badao -e ansible_password=123 --become --become-method=sudo -e ansible_sudo_pass=123 --ask-vault
NTP_ENABLED 这个最好还是 yes 吧,不然时间不同步,容易出现证书问题。
单节点
没啥特别,不贴了
五节点单主隔离
1 ansible + 1 deploy + 1 master + 2 slave [etcd 单点并共用]
# 集群部署节点:一般为运行ansible 脚本的节点
# 变量 NTP_ENABLED (=yes/no) 设置集群是否安装 chrony 时间同步
[deploy]
192.168.188.201 NTP_ENABLED=yes
# etcd集群请提供如下NODE_NAME,请注意etcd集群必须是1,3,5,7...奇数个节点
[etcd]
192.168.188.203 NODE_NAME=etcd1
[new-etcd] # 预留组,后续添加etcd节点使用
#192.168.1.x NODE_NAME=etcdx
[kube-master]
192.168.188.202
[kube-node]
192.168.188.203
192.168.188.204
[new-node] # 预留组,后续添加node节点使用
#192.168.1.xx
# 参数 NEW_INSTALL:yes表示新建,no表示使用已有harbor服务器
# 如果不使用域名,可以设置 HARBOR_DOMAIN=""
[harbor]
#192.168.1.8 HARBOR_DOMAIN="harbor.yourdomain.com" NEW_INSTALL=no
#【可选】外部负载均衡,用于自有环境负载转发 NodePort 暴露的服务等
[ex-lb]
#192.168.1.6 LB_ROLE=backup EX_VIP=192.168.1.250
#192.168.1.7 LB_ROLE=master EX_VIP=192.168.1.250
[all:vars]
# ---------集群主要参数---------------
#集群部署模式:allinone, single-master, multi-master
DEPLOY_MODE=single-master
#集群主版本号,目前支持: v1.8, v1.9, v1.10,v1.11, v1.12, v1.13
K8S_VER="v1.11"
#集群 MASTER IP,自动生成
MASTER_IP="{{ groups['kube-master'][0] }}"
KUBE_APISERVER="https://{{ MASTER_IP }}:6443"
# 集群网络插件,目前支持calico, flannel, kube-router, cilium
CLUSTER_NETWORK="flannel"
# 服务网段 (Service CIDR),注意不要与内网已有网段冲突
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."
# 集群basic auth 使用的用户名和密码
BASIC_AUTH_USER="admin"
BASIC_AUTH_PASS="test1234"
# ---------附加参数--------------------
#默认二进制文件目录
bin_dir="/opt/kube/bin"
#证书目录
ca_dir="/etc/kubernetes/ssl"
#部署目录,即 ansible 工作目录
base_dir="/etc/ansible"
八节点 - lb (keepalived+haproxy)
1 ansible + 1 deploy + 2 master + 2 slave + 2 lb [etcd 单点并共用]
配置和十一节点差不太多,不贴了
十一节点 - Overall - Deploy 隔离 + Master HA + 多 etcd 集群
1 ansible + 1 deploy + 2 master + 2 slave + 2 lb + 3 etcd
# 集群部署节点:一般为运行ansible 脚本的节点
# 变量 NTP_ENABLED (=yes/no) 设置集群是否安装 chrony 时间同步
[deploy]
192.168.188.125 NTP_ENABLED=yes
# etcd集群请提供如下NODE_NAME,注意etcd集群必须是1,3,5,7...奇数个节点
[etcd]
192.168.188.156 NODE_NAME=etcd1
192.168.188.157 NODE_NAME=etcd2
192.168.188.158 NODE_NAME=etcd3
[new-etcd] # 预留组,后续添加etcd节点使用
#192.168.1.x NODE_NAME=etcdx
[kube-master]
192.168.188.122
192.168.188.123
[new-master] # 预留组,后续添加master节点使用
#192.168.1.5
[kube-node]
192.168.188.132
192.168.188.133
[new-node] # 预留组,后续添加node节点使用
#192.168.1.xx
# 参数 NEW_INSTALL:yes表示新建,no表示使用已有harbor服务器
# 如果不使用域名,可以设置 HARBOR_DOMAIN=""
[harbor]
#192.168.1.8 HARBOR_DOMAIN="harbor.yourdomain.com" NEW_INSTALL=no
# 负载均衡(目前已支持多于2节点,一般2节点就够了) 安装 haproxy+keepalived
[lb]
192.168.188.142 LB_ROLE=backup
192.168.188.143 LB_ROLE=master
#【可选】外部负载均衡,用于自有环境负载转发 NodePort 暴露的服务等
[ex-lb]
#192.168.1.6 LB_ROLE=backup EX_VIP=192.168.1.250
#192.168.1.7 LB_ROLE=master EX_VIP=192.168.1.250
[all:vars]
# ---------集群主要参数---------------
#集群部署模式:allinone, single-master, multi-master
DEPLOY_MODE=multi-master
#集群主版本号,目前支持: v1.8, v1.9, v1.10,v1.11, v1.12, v1.13
K8S_VER="v1.10"
# 集群 MASTER IP即 LB节点VIP地址,为区别与默认apiserver端口,设置VIP监听的服务端口8443
# 公有云上请使用云负载均衡内网地址和监听端口
MASTER_IP="192.168.188.121"
KUBE_APISERVER="https://{{ MASTER_IP }}:8443"
# 集群网络插件,目前支持calico, flannel, kube-router, cilium
CLUSTER_NETWORK="flannel"
# 服务网段 (Service CIDR),注意不要与内网已有网段冲突
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."
# 集群basic auth 使用的用户名和密码
BASIC_AUTH_USER="admin"
BASIC_AUTH_PASS="test1234"
# ---------附加参数--------------------
#默认二进制文件目录
bin_dir="/opt/kube/bin"
#证书目录
ca_dir="/etc/kubernetes/ssl"
#部署目录,即 ansible 工作目录,建议不要修改
base_dir="/etc/ansible"
Issue List
-g 被替代为 --data-root
-g and --graph flags on dockerd
Deprecated In Release: v17.05.0
The -g or --graph flag for the dockerd or docker daemon command was used to indicate the directory in which to store persistent data and resource configuration and has been replaced with the more descriptive --data-root flag.
These flags were added before Docker 1.0, so will not be removed, only hidden, to discourage their use.
以上引自:
Ansible synchronize delegate_to
ansible 主机将同步任务 delegate 到两台机器 A,B 之间,并用 sudo 账户 c@A,d@B 进行 synchronize 同步,但是需要注意的是 c@A 和 d@B 之间必须可以免密登录。此时如果传输的文件或者文件所在的目录及父目录对该 sudo 账户没有读取权限,就会出现卡住的情况,想要解决权限问题,一是改文件本身的权限和 owner,二是 sudo 免密 su - root。
简单说,如果权限不能放那么开,那么最低限度,在不对文件进行转存的情况下,在原目录下,就要做到父级目录对 sudo 用户可读,文件对 root 用户可读,sudo 用户免密 su 到 root 账户。
If you don’t require password for the user to sudo on the target machine (or just do configure it this way for the rsync command) you can use delegate_to: <your_server> parameter combined with rsync_path=“sudo rsync” to run it explicitly with sudo.
sudo 账户免密登录
echo "<username> ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
以上引自:
linux “sudo” 免密设置
以上引自:
ansible批量加用户
Ansible 生成 ssh_key
kube-apiserver 报错不能连接上 etcd
报错如下:
etcd rejected connection from "192.168.188.128:50566" (error "remote error: tls: bad certificate", ServerName
最终发现总是报错证书有问题,其实是因为节点的时间没有作同步,当然也是因为我是测试环境,频繁 snapshot 到之前某个时间,然后不注意调整时间的结果。
这个清奇但是有理的思路来自一个博客,虽然博主的版面设计很二,但是写的很有道理。
Ubuntu 18.04 奇妙的 snap 从安装开始
和 Ubuntu 之前版本的差别也是显而易见。记一下目前所见:
- 修改主机名还需要修改 preserve_hostname
sudo vim /etc/cloud/cloud.cfg
#找到preserve_hostname: false修改为preserve_hostname: ture
以上引自:
Ubuntu 18.04 修改主机名
- 修改端口 ip 地址需要使用 netplan 修改
/etc/netplan/*.yaml下的所有文件将被netplan读取
/usr/lib/systemd//.service
验证一下是否为开机启动:
systemctl is-enabled supervisord
查看所有已启动的服务
systemctl list -units –type=service
killall -0 haproxy
kill -0 pid 的作用是用来检测指定的进程PID是否存在, 存在返回0, 反之返回1
- kill -9 强杀
- kill -15 自杀
- kill -0 不发送任何信号,但是会进行错误检查
另外,
- kill + pid
- pkill + 名称(缩略也可以)
- killall + 名称(全称)