离线本地测试环境资源计划说明:
hostname |
IP |
配置 |
系统版本 |
角色 |
aly8-hn1-k8s-master-001 |
|
|
Centos7.4 |
master节点&etcd集群 |
aly8-hn1-k8s-master-002 |
|
|
Centos7.4 |
master节点&etcd集群 |
aly8-hn1-k8s-master-003 |
|
|
Centos7.4 |
master节点&etcd集群 |
aly8-hn1-ops-001 |
|
|
Centos7.4 |
ansible部署节点 |
Aly8-hn1-k8s-node-001 |
|
|
Centos7.4 |
node节点 |
各节点安装python
1 2 3 4 5 6
| # 文档中脚本默认均以root用户执行 # 安装 epel 源并更新 yum install epel-release -y yum update # 安装python yum install python -y
|
在deploy节点安装及准备ansible
1 2 3 4 5 6
| yum install git python-pip -y # pip安装ansible(国内如果安装太慢可以直接用pip阿里云加速) pip install pip --upgrade -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com pip install --no-cache-dir ansible -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com # pip install pip --upgrade # pip install ansible
|
在deploy节点配置免密码登陆
1 2
| ssh-keygen -t rsa -b 2048 # 回车 回车 回车 ssh-copy-id $IPs # $IPs为所有节点地址包括自身,按照提示输入yes 和root密码
|
kubeasz配置
下载源码解压到同样目录
1 2 3 4
| git clone https://github.com/gjmzj/kubeasz.git mkdir -p /etc/ansible mv kubeasz/* /etc/ansible tar xf /root/k8sfile/k8s.1-13-2.tar.gz -C /etc/ansible/
|
配置集群参数
1 2 3
| cd /etc/ansible cp example/hosts.m-masters.example hosts vim hosts # 根据实际情况修改此hosts文件
|
Hosts配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| # 集群部署节点:一般为运行ansible 脚本的节点 # 变量 NTP_ENABLED (=yes/no) 设置集群是否安装 chrony 时间同步 [deploy] 10.1.2.66 NTP_ENABLED=no
# etcd集群请提供如下NODE_NAME,注意etcd集群必须是1,3,5,7...奇数个节点 [etcd] 10.1.2.30 NODE_NAME=etcd1 10.1.2.1 NODE_NAME=etcd2 10.1.2.2 NODE_NAME=etcd3
[kube-master] 10.1.2.30 10.1.2.1 10.1.2.2
# 负载均衡(目前已支持多于2节点,一般2节点就够了) 安装 haproxy+keepalived [lb] 10.1.2.30 LB_ROLE=master 10.1.2.1 LB_ROLE=backup
[kube-node] 10.1.2.67
# 参数 NEW_INSTALL:yes表示新建,no表示使用已有harbor服务器 # 如果不使用域名,可以设置 HARBOR_DOMAIN="" [harbor] #192.168.1.8 HARBOR_DOMAIN="harbor.yourdomain.com" NEW_INSTALL=no
# 预留组,后续添加master节点使用 [new-master] #192.168.1.5
# 预留组,后续添加node节点使用 [new-node] #192.168.1.xx
#【可选】外部负载均衡,用于自有环境负载转发 NodePort 暴露的服务等 [ex-lb] #192.168.1.6 LB_ROLE=backup EX_VIP=10.1.2.150 #192.168.1.7 LB_ROLE=master EX_VIP=10.1.2.150
[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.13"
# 集群 MASTER IP即 LB节点VIP地址,为区别与默认apiserver端口,设置VIP监听的服务端口8443 # 公有云上请使用云负载均衡内网地址和监听端口 MASTER_IP="10.1.2.166" 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="eduskscluster.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"
|
测试节点主机可达
Deploy
1 2 3 4 5 6 7 8 9 10
| # 分步安装 ansible-playbook 01.prepare.yml ansible-playbook 02.etcd.yml ansible-playbook 03.docker.yml ansible-playbook 04.kube-master.yml ansible-playbook 05.kube-node.yml ansible-playbook 06.network.yml ansible-playbook 07.cluster-addon.yml # 一步安装 #ansible-playbook 90.setup.yml
|
验证集群功能
查看集群状态
1 2 3 4
| kubectl get node kubectl cluster-info kubectl top node kubectl get ep --all-namespaces -o yaml
|
创建测试文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| cat > nginx-ds.yml <<EOF apiVersion: v1 kind: Service metadata: name: nginx-ds labels: app: nginx-ds spec: type: NodePort selector: app: nginx-ds ports: - name: http port: 80 targetPort: 80 --- apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: nginx-ds labels: addonmanager.kubernetes.io/mode: Reconcile spec: template: metadata: labels: app: nginx-ds spec: containers: - name: my-nginx image: nginx:1.7.9 ports: - containerPort: 80 EOF
kubectl create -f nginx-ds.yml
kubectl get pods -o wide|grep nginx-ds kubectl get svc -o wide|grep nginx-ds
# 检查nodeport可用性 curl node节点ip:svc端口 # 出现nginx欢迎页
|
验证coredns
1 2 3 4
| kubectl exec -it nginx-ds-8sd6z /bin/bash cat /etc/resolv.conf ping nginx-ds # 能成功解析服务到ip证明dns正常
|
验证dashboard
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| # kube-apiserver 访问 dashboard kubectl cluster-info # 也可以通过nodeport 访问 kubectl get svc -n kube-system
# 创建登录 Dashboard 的 token 和 kubeconfig 配置文件 # 上面提到,Dashboard 默认只支持 token 认证,所以如果使用 KubeConfig 文件,需要在该文件中指定 token,不支持使用 client 证书认证。
# 创建登录 token kubectl create sa dashboard-admin -n kube-system kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}') DASHBOARD_LOGIN_TOKEN=$(kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}') echo ${DASHBOARD_LOGIN_TOKEN}
# 创建使用 token 的 KubeConfig 文件 # 设置集群参数 kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=https://172.16.68.14:8443 \ --kubeconfig=dashboard.kubeconfig
# 设置客户端认证参数,使用上面创建的 Token kubectl config set-credentials dashboard_user \ --token=${DASHBOARD_LOGIN_TOKEN} \ --kubeconfig=dashboard.kubeconfig
# 设置上下文参数 kubectl config set-context default \ --cluster=kubernetes \ --user=dashboard_user \ --kubeconfig=dashboard.kubeconfig
# 设置默认上下文 kubectl config use-context default --kubeconfig=dashboard.kubeconfig
|
自定义修改
04.kube-master.yml # 去除了roles kube-node
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # to set up 'kube-master' nodes - hosts: kube-master roles: - kube-master tasks: - name: Making master nodes SchedulingDisabled shell: "{{ bin_dir }}/kubectl cordon {{ inventory_hostname }} " delegate_to: "{{ groups.deploy[0] }}" when: DEPLOY_MODE != "allinone" ignore_errors: true
- name: Setting master role name shell: "{{ bin_dir }}/kubectl label node {{ inventory_hostname }} kubernetes.io/role=master --overwrite" ignore_errors: true delegate_to: "{{ groups.deploy[0] }}"
|
公有云部署k8s集群hosts模板
hosts.m-masters.example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| # 部署节点:运行这份 ansible 脚本的节点 [deploy] 192.168.1.1
# etcd集群请提供如下NODE_NAME、NODE_IP变量 # 请注意etcd集群必须是1,3,5,7...奇数个节点 [etcd] 192.168.1.1 NODE_NAME=etcd1 NODE_IP="192.168.1.1" 192.168.1.2 NODE_NAME=etcd2 NODE_IP="192.168.1.2" 192.168.1.3 NODE_NAME=etcd3 NODE_IP="192.168.1.3"
[kube-master] 192.168.1.1 NODE_IP="192.168.1.1" 192.168.1.2 NODE_IP="192.168.1.2"
# 负载均衡至少两个节点,安装 haproxy+keepalived # 根据master节点数量同步修改roles/lb/templates/haproxy.cfg.j2 [lb] 192.168.1.1 LB_IF="eth0" LB_ROLE=backup 192.168.1.2 LB_IF="eth0" LB_ROLE=master [lb:vars] LB_EP1="192.168.1.1:6443" # api-server 实际成员地址端口 LB_EP2="192.168.1.2:6443" # api-server 实际成员地址端口 MASTER_IP="192.168.1.10" # api-server 虚地址 MASTER_PORT="8443" # api-server 服务端口
#确保node节点有变量NODE_ID=node1 [kube-node] 192.168.1.2 NODE_ID=node1 NODE_IP="192.168.1.2" 192.168.1.3 NODE_ID=node2 NODE_IP="192.168.1.3" 192.168.1.4 NODE_ID=node3 NODE_IP="192.168.1.4"
[kube-cluster:children] kube-node kube-master
# 如果启用harbor,请配置后面harbor相关参数 [harbor] #192.168.1.8 NODE_IP="192.168.1.8"
# 预留组,后续添加node节点使用 [new-node] #192.168.1.xx NODE_ID=node6 NODE_IP="192.168.1.xx" #192.168.1.xx NODE_ID=node7 NODE_IP="192.168.1.xx"
[all:vars] # ---------集群主要参数--------------- #集群 MASTER IP, 需要负载均衡,一般为VIP地址 MASTER_IP="192.168.1.10" KUBE_APISERVER="https://192.168.1.10:8443"
#pause镜像地址 POD_INFRA_CONTAINER_IMAGE=mirrorgooglecontainers/pause-amd64:3.0
#TLS Bootstrapping 使用的 Token,使用 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成 BOOTSTRAP_TOKEN="c30302226d4b810e08731702d3890f50"
# 集群网络插件,目前支持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.1.1:2380,etcd2=https://192.168.1.2:2380,etcd3=https://192.168.1.3:2380"
# etcd 集群服务地址列表, **根据实际 etcd 集群成员设置** ETCD_ENDPOINTS="https://192.168.1.1:2379,https://192.168.1.2:2379,https://192.168.1.3:2379"
# 集群basic auth 使用的用户名和密码 BASIC_AUTH_USER="admin" BASIC_AUTH_PASS="test1234"
# ---------附加参数-------------------- #默认二进制文件目录 bin_dir="/root/local/bin"
#证书目录 ca_dir="/etc/kubernetes/ssl"
#部署目录,即 ansible 工作目录,建议不要修改 base_dir="/etc/ansible"
#私有仓库 harbor服务器 (域名或者IP) #HARBOR_IP="192.168.1.8" #HARBOR_DOMAIN="harbor.yourdomain.com"
|
公有云deploy文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| # 在deploy节点生成CA相关证书,以供整个集群使用 # 以及初始化kubedns.yaml配置文件 - hosts: deploy roles: - deploy
# 集群节点的公共配置任务 - hosts: - kube-cluster - deploy - etcd - lb roles: - prepare
# [可选]多master部署时的负载均衡配置 - hosts: lb roles: - lb
# 创建etcd集群 - hosts: etcd roles: - etcd
# kubectl 客户端配置 - hosts: - kube-cluster - deploy roles: - kubectl
# docker服务安装 - hosts: kube-cluster roles: - docker
# master 节点部署 - hosts: kube-master roles: - kube-master
# node 节点部署 - hosts: kube-node roles: - kube-node
# 集群网络插件部署,只能选择一种安装 - hosts: kube-cluster roles: - { role: calico, when: "CLUSTER_NETWORK == 'calico'" } - { role: flannel, when: "CLUSTER_NETWORK == 'flannel'" }
|
参考资料
Last updated: