kubeasz部署高可用kubernetes1.17.2 并实现traefik2.1.2部署
- 2020 年 3 月 16 日
- 筆記
模板机操作
# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) # uname -a //内核升级到4.4.X以后, 关于如何升级请自行解决 Linux bs-k8s-master01 4.4.186-1.el7.elrepo.x86_64 #1 SMP Sun Jul 21 04:06:52 EDT 2019 x86_64 x86_64 x86_64 GNU/Linux #yum install python epel-release -y #yum install git python-pip -y #pip install pip --upgrade -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com #pip install ansible==2.6.12 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com #pip install netaddr -i http://pypi.douban.com/simple --trusted-host pypi.douban.com #reboot
快照 –> 克隆
克隆主机布局
主机IP | 主机名 | 主机角色 | 内存 & cpu |
---|---|---|---|
20.0.0.201 | bs-k8s-master01 | master etcd | 4C & 2G |
20.0.0.202 | bs-k8s-master02 | master etcd traefik | 2C & 2G |
20.0.0.203 | bs-k8s-master03 | master etcd traefik | 2C & 2G |
20.0.0.204 | bs-k8s-node01 | worker prometheus efk | 4C & 10G |
20.0.0.205 | bs-k8s-node02 | worker jenkins f | 4C & 3G |
20.0.0.206 | bs-k8s-node03 | woker myweb f | 4C & 2G |
20.0.0.207 | bs-k8s-harbor | ceph harbor haproxy keepalived | 2C & 2G |
20.0.0.208 | bs-k8s-gitlab | ceph gitlab | 2C & 2G |
20.0.0.209 | bs-k8s-ceph | ceph haproxy keepalived | 2C & 2G |
上表格为规划(2月份已经验证几乎可行),按需按量增减,符合自己的物理机要求
bs-k8s-master01为例 初始化
#hostnamectl set-hostname bs-k8s-master01 # vimn # cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet BOOTPROTO=none NAME=eth0 DEVICE=eth0 ONBOOT=yes IPADDR=20.0.0.201 PREFIX=24 GATEWAY=20.0.0.2 DNS1=223.5.5.5 #init 0
做快照
配置DNS
# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 20.0.0.201 bs-k8s-master01 20.0.0.202 bs-k8s-master02 20.0.0.203 bs-k8s-master03 20.0.0.204 bs-k8s-node01 20.0.0.205 bs-k8s-node02 20.0.0.206 bs-k8s-node03 20.0.0.207 bs-k8s-harbor harbor.linux.com 20.0.0.208 bs-k8s-gitlab 20.0.0.209 bs-k8s-ceph
ssh免密钥登陆
# ssh-keygen -t rsa # yum install -y sshpass # mkdir /service/scripts -p # cat /service/scripts/ssh-key.sh ########################################################################## #Author: zisefeizhu #QQ: 2********0 #Date: 2020-03-16 #FileName: /service/scripts/ssh-key.sh #URL: https://www.cnblogs.com/zisefeizhu/ #Description: The test script #Copyright (C): 2020 All rights reserved ########################################################################## #目标主机列表 IP=" 20.0.0.201 bs-k8s-master01 20.0.0.202 bs-k8s-master02 20.0.0.203 bs-k8s-master03 20.0.0.204 bs-k8s-node01 20.0.0.205 bs-k8s-node02 20.0.0.206 bs-k8s-node03 20.0.0.207 bs-k8s-harbor 20.0.0.208 bs-k8s-gitlab 20.0.0.209 bs-k8s-ceph " for node in ${IP};do sshpass -p 1 ssh-copy-id ${node} -o StrictHostKeyChecking=no scp /etc/hosts ${node}:/etc/hosts if [ $? -eq 0 ];then echo "${node} 秘钥copy完成" else echo "${node} 秘钥copy失败" fi done # sh -x /service/scripts/ssh-key.sh
bs-k8s-master01为部署机
下载工具脚本easzup,举例使用kubeasz版本2.2.0 # pwd /data # export release=2.2.0 # curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/easzup # chmod +x ./easzup # cat easzup ...... export DOCKER_VER=19.03.5 export KUBEASZ_VER=2.2.0 export K8S_BIN_VER=v1.17.2 export EXT_BIN_VER=0.4.0 export SYS_PKG_VER=0.3.3 ...... cat > /etc/docker/daemon.json << EOF { "registry-mirrors": [ "https://dockerhub.azk8s.cn", "https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com" ], "max-concurrent-downloads": 10, "log-driver": "json-file", "log-level": "warn", "log-opts": { "max-size": "10m", "max-file": "3" }, "data-root": "/var/lib/docker" } ...... # images needed by k8s cluster calicoVer=v3.4.4 corednsVer=1.6.6 dashboardVer=v2.0.0-rc3 dashboardMetricsScraperVer=v1.0.3 flannelVer=v0.11.0-amd64 metricsVer=v0.3.6 pauseVer=3.1 traefikVer=v1.7.20 ...... # ./easzup -D [INFO] Action begin : download_all Unit docker.service could not be found. Unit containerd.service could not be found. which: no docker in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) [INFO] downloading docker binaries 19.03.5 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 60.3M 100 60.3M 0 0 2240k 0 0:00:27 0:00:27 --:--:-- 1881k [INFO] generate docker service file [INFO] generate docker config file [INFO] prepare register mirror for CN [INFO] turn off selinux in CentOS/Redhat Disabled [INFO] enable and start docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /etc/systemd/system/docker.service. [INFO] downloading kubeasz 2.2.0 [INFO] run a temporary container Unable to find image 'easzlab/kubeasz:2.2.0' locally 2.2.0: Pulling from easzlab/kubeasz 9123ac7c32f7: Pull complete 837e3bfc1a1b: Pull complete Digest: sha256:a1fc4a75fde5aee811ff230e88ffa80d8bfb66e9c1abc907092abdbff073735e Status: Downloaded newer image for easzlab/kubeasz:2.2.0 60c5bc91b52996f009ebab89e1daf6db77fd7a8b3313843fb7fba7ef6f207014 [INFO] cp kubeasz code from the temporary container [INFO] stop&remove temporary container temp_easz [INFO] downloading kubernetes v1.17.2 binaries v1.17.2: Pulling from easzlab/kubeasz-k8s-bin 9123ac7c32f7: Already exists fa197cdd54ac: Pull complete Digest: sha256:d9fdc65a79a2208f48d5bf9a7e51cf4a4719c978742ef59b507bc8aaca2564f5 Status: Downloaded newer image for easzlab/kubeasz-k8s-bin:v1.17.2 docker.io/easzlab/kubeasz-k8s-bin:v1.17.2 [INFO] run a temporary container e452799cb2a32cd82c3b976e47c9c8f9fa67079143a29783cb8e4223dc1011e6 [INFO] cp k8s binaries [INFO] stop&remove temporary container temp_k8s_bin [INFO] downloading extral binaries kubeasz-ext-bin:0.4.0 0.4.0: Pulling from easzlab/kubeasz-ext-bin 9123ac7c32f7: Already exists 96aeb45eaf70: Pull complete Digest: sha256:cb7c51e9005a48113086002ae53b805528f4ac31e7f4c4634e22c98a8230a5bb Status: Downloaded newer image for easzlab/kubeasz-ext-bin:0.4.0 docker.io/easzlab/kubeasz-ext-bin:0.4.0 [INFO] run a temporary container 7cba170c92b590f787b364ce4996b99a26d53f3a2eb6222ac483fb2f1ec01a43 [INFO] cp extral binaries [INFO] stop&remove temporary container temp_ext_bin [INFO] downloading system packages kubeasz-sys-pkg:0.3.3 0.3.3: Pulling from easzlab/kubeasz-sys-pkg e7c96db7181b: Pull complete 291d9a0e6c41: Pull complete 5f5b83293598: Pull complete 376121b0ab94: Pull complete 1c7cd77764e9: Pull complete d8d58def0f00: Pull complete Digest: sha256:342471d786ba6d9bb95c15c573fd7d24a6fd30de51049c2c0b543d09d28b5d9f Status: Downloaded newer image for easzlab/kubeasz-sys-pkg:0.3.3 docker.io/easzlab/kubeasz-sys-pkg:0.3.3 [INFO] run a temporary container a5e4078ebf08b40834aed8db62b63aa131064425ddd1f9cc2abcb3b592ea2b40 [INFO] cp system packages [INFO] stop&remove temporary container temp_sys_pkg [INFO] downloading offline images v3.4.4: Pulling from calico/cni c87736221ed0: Pull complete 5c9ca5efd0e4: Pull complete 208ecfdac035: Pull complete 4112fed29204: Pull complete Digest: sha256:bede24ded913fb9f273c8392cafc19ac37d905017e13255608133ceeabed72a1 Status: Downloaded newer image for calico/cni:v3.4.4 docker.io/calico/cni:v3.4.4 v3.4.4: Pulling from calico/kube-controllers c87736221ed0: Already exists e90e29149864: Pull complete 5d1329dbb1d1: Pull complete Digest: sha256:b2370a898db0ceafaa4f0b8ddd912102632b856cc010bb350701828a8df27775 Status: Downloaded newer image for calico/kube-controllers:v3.4.4 docker.io/calico/kube-controllers:v3.4.4 v3.4.4: Pulling from calico/node c87736221ed0: Already exists 07330e865cef: Pull complete d4d8bb3c8ac5: Pull complete 870dc1a5d2d5: Pull complete af40827f5487: Pull complete 76fa1069853f: Pull complete Digest: sha256:1582527b4923ffe8297d12957670bc64bb4f324517f57e4fece3f6289d0eb6a1 Status: Downloaded newer image for calico/node:v3.4.4 docker.io/calico/node:v3.4.4 1.6.6: Pulling from coredns/coredns c6568d217a00: Pull complete 967f21e47164: Pull complete Digest: sha256:41bee6992c2ed0f4628fcef75751048927bcd6b1cee89c79f6acb63ca5474d5a Status: Downloaded newer image for coredns/coredns:1.6.6 docker.io/coredns/coredns:1.6.6 v2.0.0-rc3: Pulling from kubernetesui/dashboard d8fcb18be2fe: Pull complete Digest: sha256:c5d991d02937ac0f49cb62074ee0bd1240839e5814d6d7b51019f08bffd871a6 Status: Downloaded newer image for kubernetesui/dashboard:v2.0.0-rc3 docker.io/kubernetesui/dashboard:v2.0.0-rc3 v0.11.0-amd64: Pulling from easzlab/flannel cd784148e348: Pull complete 04ac94e9255c: Pull complete e10b013543eb: Pull complete 005e31e443b1: Pull complete 74f794f05817: Pull complete Digest: sha256:bd76b84c74ad70368a2341c2402841b75950df881388e43fc2aca000c546653a Status: Downloaded newer image for easzlab/flannel:v0.11.0-amd64 docker.io/easzlab/flannel:v0.11.0-amd64 v1.0.3: Pulling from kubernetesui/metrics-scraper 75d12d4b9104: Pull complete fcd66fda0b81: Pull complete 53ff3f804bbd: Pull complete Digest: sha256:40f1d5785ea66609b1454b87ee92673671a11e64ba3bf1991644b45a818082ff Status: Downloaded newer image for kubernetesui/metrics-scraper:v1.0.3 docker.io/kubernetesui/metrics-scraper:v1.0.3 v0.3.6: Pulling from mirrorgooglecontainers/metrics-server-amd64 e8d8785a314f: Pull complete b2f4b24bed0d: Pull complete Digest: sha256:c9c4e95068b51d6b33a9dccc61875df07dc650abbf4ac1a19d58b4628f89288b Status: Downloaded newer image for mirrorgooglecontainers/metrics-server-amd64:v0.3.6 docker.io/mirrorgooglecontainers/metrics-server-amd64:v0.3.6 3.1: Pulling from mirrorgooglecontainers/pause-amd64 67ddbfb20a22: Pull complete Digest: sha256:59eec8837a4d942cc19a52b8c09ea75121acc38114a2c68b98983ce9356b8610 Status: Downloaded newer image for mirrorgooglecontainers/pause-amd64:3.1 docker.io/mirrorgooglecontainers/pause-amd64:3.1 v1.7.20: Pulling from library/traefik 42e7d26ec378: Pull complete 8a753f02eeff: Pull complete ab927d94d255: Pull complete Digest: sha256:5ec34caf19d114f8f0ed76f9bc3dad6ba8cf6d13a1575c4294b59b77709def39 Status: Downloaded newer image for traefik:v1.7.20 docker.io/library/traefik:v1.7.20 2.2.0: Pulling from easzlab/kubeasz Digest: sha256:a1fc4a75fde5aee811ff230e88ffa80d8bfb66e9c1abc907092abdbff073735e Status: Image is up to date for easzlab/kubeasz:2.2.0 docker.io/easzlab/kubeasz:2.2.0 [INFO] Action successed : download_all
/etc/ansible 包含 kubeasz 版本为 ${release} 的发布代码
/etc/ansible/bin 包含 k8s/etcd/docker/cni 等二进制文件
/etc/ansible/down 包含集群安装时需要的离线容器镜像
/etc/ansible/down/packages 包含集群安装时需要的系统基础软件
配置配置清单
# cd /etc/ansible/ # ll 总用量 92 -rw-rw-r-- 1 root root 395 2月 1 10:35 01.prepare.yml -rw-rw-r-- 1 root root 58 2月 1 10:35 02.etcd.yml -rw-rw-r-- 1 root root 149 2月 1 10:35 03.containerd.yml -rw-rw-r-- 1 root root 137 2月 1 10:35 03.docker.yml -rw-rw-r-- 1 root root 470 2月 1 10:35 04.kube-master.yml -rw-rw-r-- 1 root root 140 2月 1 10:35 05.kube-node.yml -rw-rw-r-- 1 root root 408 2月 1 10:35 06.network.yml -rw-rw-r-- 1 root root 77 2月 1 10:35 07.cluster-addon.yml -rw-rw-r-- 1 root root 3686 2月 1 10:35 11.harbor.yml -rw-rw-r-- 1 root root 431 2月 1 10:35 22.upgrade.yml -rw-rw-r-- 1 root root 1975 2月 1 10:35 23.backup.yml -rw-rw-r-- 1 root root 113 2月 1 10:35 24.restore.yml -rw-rw-r-- 1 root root 1752 2月 1 10:35 90.setup.yml -rw-rw-r-- 1 root root 1127 2月 1 10:35 91.start.yml -rw-rw-r-- 1 root root 1120 2月 1 10:35 92.stop.yml -rw-rw-r-- 1 root root 337 2月 1 10:35 99.clean.yml -rw-rw-r-- 1 root root 10283 2月 1 10:35 ansible.cfg drwxrwxr-x 3 root root 4096 3月 16 09:55 bin drwxrwxr-x 2 root root 23 2月 1 10:55 dockerfiles drwxrwxr-x 8 root root 92 2月 1 10:55 docs drwxrwxr-x 3 root root 322 3月 16 09:57 down drwxrwxr-x 2 root root 52 2月 1 10:55 example drwxrwxr-x 14 root root 218 2月 1 10:55 manifests drwxrwxr-x 2 root root 322 2月 1 10:55 pics -rw-rw-r-- 1 root root 5607 2月 1 10:35 README.md drwxrwxr-x 23 root root 4096 2月 1 10:55 roles drwxrwxr-x 2 root root 294 2月 1 10:55 tools # cp example/hosts.multi-node ./hosts # cat hosts # 'etcd' cluster should have odd member(s) (1,3,5,...) # variable 'NODE_NAME' is the distinct name of a member in 'etcd' cluster [etcd] 20.0.0.201 NODE_NAME=etcd1 20.0.0.202 NODE_NAME=etcd2 20.0.0.203 NODE_NAME=etcd3 # master node(s) [kube-master] 20.0.0.201 20.0.0.202 20.0.0.203 # work node(s) [kube-node] 20.0.0.204 20.0.0.205 20.0.0.206 # [optional] harbor server, a private docker registry # 'NEW_INSTALL': 'yes' to install a harbor server; 'no' to integrate with existed one # 'SELF_SIGNED_CERT': 'no' you need put files of certificates named harbor.pem and harbor-key.pem in directory 'down' [harbor] #192.168.1.8 HARBOR_DOMAIN="harbor.yourdomain.com" NEW_INSTALL=no SELF_SIGNED_CERT=yes # [optional] loadbalance for accessing k8s from outside [ex-lb] 20.0.0.209 LB_ROLE=backup EX_APISERVER_VIP=20.0.0.250 EX_APISERVER_PORT=8443 20.0.0.207 LB_ROLE=master EX_APISERVER_VIP=20.0.0.250 EX_APISERVER_PORT=8443 # [optional] ntp server for the cluster [chrony] 20.0.0.202 [all:vars] # --------- Main Variables --------------- # Cluster container-runtime supported: docker, containerd CONTAINER_RUNTIME="docker" # Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn CLUSTER_NETWORK="calico" # Service proxy mode of kube-proxy: 'iptables' or 'ipvs' PROXY_MODE="ipvs" # K8S Service CIDR, not overlap with node(host) networking SERVICE_CIDR="10.68.0.0/16" # Cluster CIDR (Pod CIDR), not overlap with node(host) networking CLUSTER_CIDR="172.20.0.0/16" # NodePort Range NODE_PORT_RANGE="20000-40000" # Cluster DNS Domain CLUSTER_DNS_DOMAIN="cluster.local." # -------- Additional Variables (don't change the default value right now) --- # Binaries Directory bin_dir="/opt/kube/bin" # CA and other components cert/key Directory ca_dir="/etc/kubernetes/ssl" # Deploy Directory (kubeasz workspace) base_dir="/etc/ansible" # ansible all -m ping 20.0.0.202 | SUCCESS => { "changed": false, "ping": "pong" } 20.0.0.209 | SUCCESS => { "changed": false, "ping": "pong" } 20.0.0.207 | SUCCESS => { "changed": false, "ping": "pong" } 20.0.0.203 | SUCCESS => { "changed": false, "ping": "pong" } 20.0.0.201 | SUCCESS => { "changed": false, "ping": "pong" } 20.0.0.204 | SUCCESS => { "changed": false, "ping": "pong" } 20.0.0.206 | SUCCESS => { "changed": false, "ping": "pong" } 20.0.0.205 | SUCCESS => { "changed": false, "ping": "pong" }
部署kubernetes 1.17.2高可用集群
#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 # kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-2 Healthy {"health":"true"} etcd-0 Healthy {"health":"true"} etcd-1 Healthy {"health":"true"} #ansible-playbook 06.network.yml # kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-6cf5b744d7-7wnlw 1/1 Running 0 6m38s kube-system calico-node-25dlc 1/1 Running 0 6m37s kube-system calico-node-49q4n 1/1 Running 0 6m37s kube-system calico-node-4gmcp 1/1 Running 0 6m37s kube-system calico-node-gt4bt 1/1 Running 0 6m37s kube-system calico-node-svcdj 1/1 Running 0 6m38s kube-system calico-node-tkrqt 1/1 Running 0 6m37s #命令补全 # source /usr/share/bash-completion/bash_completion # source <(kubectl completion bash) # echo "source <(kubectl completion bash)" >> ~/.bashrc # pwd /etc/ansible/manifests/metrics-server # ll 总用量 24 -rw-rw-r-- 1 root root 303 2月 1 10:35 auth-delegator.yaml -rw-rw-r-- 1 root root 324 2月 1 10:35 auth-reader.yaml -rw-rw-r-- 1 root root 293 2月 1 10:35 metrics-apiservice.yaml -rw-rw-r-- 1 root root 1107 3月 16 12:33 metrics-server-deployment.yaml -rw-rw-r-- 1 root root 291 2月 1 10:35 metrics-server-service.yaml -rw-rw-r-- 1 root root 517 2月 1 10:35 resource-reader.yaml #部署pod到特定主机 具体原因看主机布局 # cat metrics-server-deployment.yaml //增加 nodeSelector: ## 设置node筛选器,在特定label的节点上启动 metricsserver: "true" #kubectl label nodes 20.0.0.204 metricsserver=true # kubectl apply -f . # kubectl get pods --all-namespaces -o wide | grep metrics kube-system metrics-server-6694c7dd66-p6x6n 1/1 Running 1 148m 172.20.46.70 20.0.0.204 <none> <none> #Metrics Server是一个集群范围的资源使用情况的数据聚合器。作为一个应用部署在集群中 # kubectl top pods --all-namespaces NAMESPACE NAME CPU(cores) MEMORY(bytes) kube-system calico-kube-controllers-6cf5b744d7-7wnlw 1m 14Mi kube-system calico-node-25dlc 60m 53Mi kube-system calico-node-49q4n 39m 52Mi kube-system calico-node-4gmcp 20m 50Mi kube-system calico-node-gt4bt 80m 52Mi kube-system calico-node-svcdj 21m 51Mi kube-system calico-node-tkrqt 37m 55Mi kube-system coredns-76b74f549-km72p 9m 13Mi kube-system metrics-server-6694c7dd66-p6x6n 5m 17Mi # kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% 20.0.0.201 297m 7% 829Mi 64% 20.0.0.202 282m 15% 790Mi 61% 20.0.0.203 307m 17% 799Mi 62% 20.0.0.204 182m 4% 411Mi 5% 20.0.0.205 293m 7% 384Mi 17% 20.0.0.206 168m 4% 322Mi 25%
部署traefik 2.1 代理
在 traefik v2.1 版本后,开始使用 CRD(Custom Resource Definition)来完成路由配置等,所以需要提前创建 CRD 资源。
创建 traefik-crd.yaml 文件
# cat traefik-crd.yaml ########################################################################## #Author: zisefeizhu #QQ: 2********0 #Date: 2020-03-16 #FileName: traefik-crd.yaml #URL: https://www.cnblogs.com/zisefeizhu/ #Description: The test script #Copyright (C): 2020 All rights reserved ########################################################################### ## IngressRoute apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: ingressroutes.traefik.containo.us spec: scope: Namespaced group: traefik.containo.us version: v1alpha1 names: kind: IngressRoute plural: ingressroutes singular: ingressroute --- ## IngressRouteTCP apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: ingressroutetcps.traefik.containo.us spec: scope: Namespaced group: traefik.containo.us version: v1alpha1 names: kind: IngressRouteTCP plural: ingressroutetcps singular: ingressroutetcp --- ## Middleware apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: middlewares.traefik.containo.us spec: scope: Namespaced group: traefik.containo.us version: v1alpha1 names: kind: Middleware plural: middlewares singular: middleware --- ## TLSOption apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: tlsoptions.traefik.containo.us spec: scope: Namespaced group: traefik.containo.us version: v1alpha1 names: kind: TLSOption plural: tlsoptions singular: tlsoption --- ## TraefikService apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: traefikservices.traefik.containo.us spec: scope: Namespaced group: traefik.containo.us version: v1alpha1 names: kind: TraefikService plural: traefikservices singular: traefikservice
创建rbac权限
Kubernetes 在 1.6 版本中引入了基于角色的访问控制(RBAC)策略,方便对 Kubernetes 资源和 API 进行细粒度控制。Traefik 需要一定的权限,所以这里提前创建好 Traefik ServiceAccount 并分配一定的权限。
# cat traefik-rbac.yaml ########################################################################## #Author: zisefeizhu #QQ: 2********0 #Date: 2020-03-16 #FileName: traefik-rbac.yaml #URL: https://www.cnblogs.com/zisefeizhu/ #Description: The test script #Copyright (C): 2020 All rights reserved ########################################################################### ## ServiceAccount apiVersion: v1 kind: ServiceAccount metadata: namespace: kube-system name: traefik-ingress-controller --- ## ClusterRole kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: [""] resources: ["services","endpoints","secrets"] verbs: ["get","list","watch"] - apiGroups: ["extensions"] resources: ["ingresses"] verbs: ["get","list","watch"] - apiGroups: ["extensions"] resources: ["ingresses/status"] verbs: ["update"] - apiGroups: ["traefik.containo.us"] resources: ["middlewares"] verbs: ["get","list","watch"] - apiGroups: ["traefik.containo.us"] resources: ["ingressroutes"] verbs: ["get","list","watch"] - apiGroups: ["traefik.containo.us"] resources: ["ingressroutetcps"] verbs: ["get","list","watch"] - apiGroups: ["traefik.containo.us"] resources: ["tlsoptions"] verbs: ["get","list","watch"] - apiGroups: ["traefik.containo.us"] resources: ["traefikservices"] verbs: ["get","list","watch"] --- ## ClusterRoleBinding kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: traefik-ingress-controller subjects: - kind: ServiceAccount name: traefik-ingress-controller namespace: kube-system
创建traefik配置文件
# cat traefik-config.yaml ########################################################################## #Author: zisefeizhu #QQ: 2********0 #Date: 2020-03-16 #FileName: traefik-config.yaml #URL: https://www.cnblogs.com/zisefeizhu/ #Description: The test script #Copyright (C): 2020 All rights reserved ########################################################################### kind: ConfigMap apiVersion: v1 metadata: name: traefik-config namespace: kube-system data: traefik.yaml: |- ping: "" ## 启用 Ping serversTransport: insecureSkipVerify: true ## Traefik 忽略验证代理服务的 TLS 证书 api: insecure: true ## 允许 HTTP 方式访问 API dashboard: true ## 启用 Dashboard debug: false ## 启用 Debug 调试模式 metrics: prometheus: "" ## 配置 Prometheus 监控指标数据,并使用默认配置 entryPoints: web: address: ":80" ## 配置 80 端口,并设置入口名称为 web websecure: address: ":443" ## 配置 443 端口,并设置入口名称为 websecure redis: address: ":663" providers: kubernetesCRD: "" ## 启用 Kubernetes CRD 方式来配置路由规则 kubernetesIngress: "" ## 启动 Kubernetes Ingress 方式来配置路由规则 log: filePath: "" ## 设置调试日志文件存储路径,如果为空则输出到控制台 level: error ## 设置调试日志级别 format: json ## 设置调试日志格式 accessLog: filePath: "" ## 设置访问日志文件存储路径,如果为空则输出到控制台 format: json ## 设置访问调试日志格式 bufferingSize: 0 ## 设置访问日志缓存行数 filters: #statusCodes: ["200"] ## 设置只保留指定状态码范围内的访问日志 retryAttempts: true ## 设置代理访问重试失败时,保留访问日志 minDuration: 20 ## 设置保留请求时间超过指定持续时间的访问日志 fields: ## 设置访问日志中的字段是否保留(keep 保留、drop 不保留) defaultMode: keep ## 设置默认保留访问日志字段 names: ## 针对访问日志特别字段特别配置保留模式 ClientUsername: drop headers: ## 设置 Header 中字段是否保留 defaultMode: keep ## 设置默认保留 Header 中字段 names: ## 针对 Header 中特别字段特别配置保留模式 User-Agent: redact Authorization: drop Content-Type: keep
部署traefik
# cat traefik-deploy.yaml ########################################################################## #Author: zisefeizhu #QQ: 2********0 #Date: 2020-03-16 #FileName: traefik-deploy.yaml #URL: https://www.cnblogs.com/zisefeizhu/ #Description: The test script #Copyright (C): 2020 All rights reserved ########################################################################### apiVersion: v1 kind: Service metadata: name: traefik namespace: kube-system spec: ports: - name: web port: 80 - name: websecure port: 443 - name: admin port: 8080 selector: app: traefik --- apiVersion: apps/v1 kind: DaemonSet metadata: name: traefik-ingress-controller namespace: kube-system labels: app: traefik spec: selector: matchLabels: app: traefik template: metadata: name: traefik labels: app: traefik spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 1 containers: - image: traefik:v2.1.2 name: traefik-ingress-lb ports: - name: web containerPort: 80 hostPort: 80 ## 将容器端口绑定所在服务器的 80 端口 - name: websecure containerPort: 443 hostPort: 443 ## 将容器端口绑定所在服务器的 443 端口 - name: redis containerPort: 6379 hostPort: 6379 - name: admin containerPort: 8080 ## Traefik Dashboard 端口 resources: limits: cpu: 2000m memory: 1024Mi requests: cpu: 1000m memory: 1024Mi securityContext: capabilities: drop: - ALL add: - NET_BIND_SERVICE args: - --configfile=/config/traefik.yaml volumeMounts: - mountPath: "/config" name: "config" volumes: - name: config configMap: name: traefik-config tolerations: ## 设置容忍所有污点,防止节点被设置污点 - operator: "Exists" nodeSelector: ## 设置node筛选器,在特定label的节点上启动 IngressProxy: "true"
配置traefik路由规则
# cat traefik-dashboard-route.yaml ########################################################################## #Author: zisefeizhu #QQ: 2********0 #Date: 2020-03-16 #FileName: traefik-dashboard-route.yaml #URL: https://www.cnblogs.com/zisefeizhu/ #Description: The test script #Copyright (C): 2020 All rights reserved ########################################################################### apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: traefik-dashboard-route namespace: kube-system spec: entryPoints: - web routes: - match: Host(`traefik.linux.com`) kind: Rule services: - name: traefik port: 8080
节点设置label
#kubectl label nodes 20.0.0.202 IngressProxy=true #kubectl label nodes 20.0.0.203 IngressProxy=true 如果想删除标签,可以使用 kubectl label nodes nodeIP IngressProxy- 命令
kubernetes部署traefik
#kubectl apply -f .
完成 traefik的部署
# kubectl get pods --all-namespaces -o wide kube-system traefik-ingress-controller-m8jf9 1/1 Running 0 7m34s 172.20.177.130 20.0.0.202 <none> <none> kube-system traefik-ingress-controller-r7cgl 1/1 Running 0 7m25s 172.20.194.130 20.0.0.203 <none> <none>