一, ansible安装k3s集群

下载ansible安装k3s脚本:

ansible-galaxy install xanmanning.k3s

ansible role目录结构:

├── hosts.ini
├── roles
│   ├── k3s
│   │   ├── defaults
│   │   │   └── main.yml
│   │   ├── files
│   │   │   ├── docker
│   │   │   │   ├── bin
│   │   │   │   │   ├── containerd
│   │   │   │   │   ├── containerd-shim
│   │   │   │   │   ├── ctr
│   │   │   │   │   ├── docker
│   │   │   │   │   ├── docker-compose
│   │   │   │   │   ├── dockerd
│   │   │   │   │   ├── docker-init
│   │   │   │   │   ├── docker-proxy
│   │   │   │   │   └── runc
│   │   │   │   ├── docker
│   │   │   │   ├── docker-tag
│   │   │   │   └── libseccomp-2.3.1-4.el7.x86_64.rpm
│   │   │   ├── images
│   │   │   │   └── images.tar.gz
│   │   │   ├── k3s-v1.18.2+k3s1.tar.gz
│   │   │   ├── kube-nginx.tar.gz
│   │   │   └── push_images.sh
│   │   ├── handlers
│   │   │   └── main.yml
│   │   ├── tasks
│   │   │   ├── build
│   │   │   │   ├── configure-k3s-cluster.yml
│   │   │   │   ├── download-k3s.yml
│   │   │   │   ├── get-systemd-context.yml
│   │   │   │   ├── get-version.yml
│   │   │   │   ├── install-docker-amazon.yml
│   │   │   │   ├── install-docker-opensuse-leap.yml
│   │   │   │   ├── install-docker-prerequisites-debian.yml
│   │   │   │   ├── install-docker-prerequisites-redhat.yml
│   │   │   │   ├── install-docker-prerequisites-suse.yml
│   │   │   │   ├── install-docker-suse.yml
│   │   │   │   ├── install-docker.yml
│   │   │   │   ├── install-k3s.yml
│   │   │   │   ├── install-kube-nginx.yml
│   │   │   │   ├── load_images.yml
│   │   │   │   ├── optimization-host.yml
│   │   │   │   ├── preconfigure-k3s-auto-deploying-manifests.yml
│   │   │   │   ├── preconfigure-k3s.yml
│   │   │   │   └── prepare-host-optimization.yml
│   │   │   ├── main.yml
│   │   │   ├── operate
│   │   │   │   ├── start-k3s.yml
│   │   │   │   └── stop-k3s.yml
│   │   │   ├── state-downloaded.yml
│   │   │   ├── state-installed.yml
│   │   │   ├── state-restarted.yml
│   │   │   ├── state-started.yml
│   │   │   ├── state-stopped.yml
│   │   │   ├── state-uninstalled.yml
│   │   │   ├── teardown
│   │   │   │   ├── drain-and-remove-nodes.yml
│   │   │   │   ├── uninstall-docker-amazon.yml
│   │   │   │   ├── uninstall-docker-opensuse-leap.yml
│   │   │   │   ├── uninstall-docker-prerequisites-debian.yml
│   │   │   │   ├── uninstall-docker-prerequisites-redhat.yml
│   │   │   │   ├── uninstall-docker-prerequisites-suse.yml
│   │   │   │   ├── uninstall-docker-suse.yml
│   │   │   │   ├── uninstall-docker.yml
│   │   │   │   ├── uninstall-k3s.yml
│   │   │   │   └── uninstall-kube-nginx.yml
│   │   │   └── validate
│   │   │   ├── check-environment.yml
│   │   │   ├── check-experimental-variables.yml
│   │   │   ├── check-master-count.yml
│   │   │   ├── check-uninstalled.yml
│   │   │   ├── check-unsupported-rootless.yml
│   │   │   ├── check-variables.yml
│   │   │   └── main.yml
│   │   ├── templates
│   │   │   ├── docker
│   │   │   │   ├── containerd.service.j2
│   │   │   │   ├── daemon.json.j2
│   │   │   │   ├── docker.service.j2
│   │   │   │   └── docker.socket.j2
│   │   │   ├── k3s-killall.sh.j2
│   │   │   ├── k3s.service.j2
│   │   │   ├── k3s-uninstall.sh.j2
│   │   │   ├── kube-nginx
│   │   │   │   ├── kube-nginx.conf.j2
│   │   │   │   └── kube-nginx.service.j2
│   │   │   └── manifests
│   │   │   ├── calico.yaml.j2
│   │   │   ├── cert-manager-no-webhook.yaml.j2
│   │   │   ├── coredns.yaml.j2
│   │   │   ├── kuboard.yaml.j2
│   │   │   ├── local-storage.yaml.j2
│   │   │   ├── metrics-server-deployment.yaml.j2
│   │   │   ├── metrics-server.yaml
│   │   │   ├── nginx-ingress-controller.yaml.j2
│   │   │   └── nginx-ingress.yaml.j2
│   │   └── vars
│   │   └── main.yml

│   └── registry
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   │   ├── k3s-images
│   │   │   └── k3s-images.tar.gz
│   │   └── registry-images
│   │   └── registry_2.7.1.tar
│   ├── tasks
│   │   ├── main.yml
│   │   ├── state-installed.yml
│   │   ├── state-uninstalled.yml
│   │   └── uninstall.yml
│   └── templates
│   ├── config.yml.j2
│   └── docker-compose.yml.j2
├── run.yml

 

其中的坑有:

  1. k3s的apiserver高可用默认用的是ipvs, 可通过k3s_kubelet_args定义, 可以通过k3s_control_node_address变量来定义一个VIP或SLB(IP地址或域名)来代理apiserver集群;  在没有VIP或SLB的情况下, 可通过在每个节点上安装一个nginx来做apiserver的代理, 我命名为了kube-nginx, 并且定义了一个本地端口:8443, 即: k3s_https_port=6443 (apiserver), k3s_control_node_https_port=8443(nginx), 这样就可将k3s_control_node_address定义为’127.0.0.1′, 来使k3s连接本机8443端口
  2. k3s_node_name要是主机名, 不能是IP, 如果定义成IP的话, 服务器上运行kubectl logs/exec 会报错:x509: certificate is valid for 127.0.0.1, not 172.20.48.132
  3. 安装完成后, 一个master节点的calico/node始终启不来, 报错:

    Warning Unhealthy 2m30s (x48 over 10m) kubelet, ncc-gpaas-group07-node05 (combined from similar events): Readiness probe failed: 2020-06-14 09:53:11.875 [INFO][2190] confd/health.go 177: Number of node(s) with BGP peering established = 0
    calico/node is not ready: BIRD is not ready: BGP not established with 172.20.48.161,172.20.47.65

    原因是:

    参考了如下:

    calico/node is not ready: BIRD is not ready: BGP not established (Calico 3.6 / k8s 1.14.1)

    https://stackoverflow.com/questions/54465963/calico-node-is-not-ready-bird-is-not-ready-bgp-not-established

    https://q.cnblogs.com/q/125235/
    其中提问者改变网段后问题解决了

    https://github.com/projectcalico/calico/issues/2561#issuecomment-485648104
    有其他人通过改变绑定的网络接口解决问题
    https://github.com/projectcalico/calico/issues/2561#issuecomment-531537534

    总结一下,应该是calico在多网络接口时自动检测到错误的网络接口,导致网络无法连通

    在calico.yml.j2文件里加上如下:

  4. 当定义多个master节点时, 需要使用etcd/mysql/dqlite/pg等存储, 而使用dqlite时还要将k3s_use_experimental设为true, 而且要保证奇数个master节点, 不然k3s会报错

 

ansible playbook其中做了如下改动:

hosts.ini:

 

defaults/main.yml 增加如下:

 

tasks/state-installed.yml: 将preconfigure-k3s-auto-deploying-manifests.yml和apply manifests放到最后执行, 因为k3s启动时会在/var/lib/rancher/k3s/server/manifests/目录生成一些要启动的manifests, 需要等k3s启动完成后, 再通过模块生成将此目录下所需文件进行覆盖,然后再apply

roles/k3s/tasks/build/optimization-host.yml, 安装前进行系统优化:

 

build/preconfigure-k3s-auto-deploying-manifests.yml: 创建metrics-server时进行了修改, 将此放入metrics-server子目录, 与rancher自动生成的保持一致

 

tasks/build/download-k3s.yml: 加入离线安装步骤

 

tasks/build/install-docker-prerequisites-redhat.yml:  在线安装时使用, 如果要通过外网在线安装docker,由于官方源下载太慢,所以修改为国内源, 其中下面注释的地方打开后可以使用国内源

 

tasks/build/install-docker.yml 增加配置docker

 

templates/docker/daemon.json.j2:

templates/k3s.service.j2, 其中增加了k3s_node_labels, k3s_tls_san 定义,

 

templates/kube-nginx/kube-nginx.conf.j2:

templates/kube-nginx/kube-nginx.service.j2

tasks/build/install-kube-nginx.yml

tasks/build/load_images.yml:

 

 

总的playbook: k3s.yml

 

其中hosts.ini文件可以这样定义:

说明:
会选择有k3s_control_node=true的来安装master
172.20.47.2: k3s master, 并将node打上label: node.kubernetes.io/system: “” 和node.kubernetes.io/ingress: “”,  会安装registry镜像仓库
172.20.47.3 k3s master, 并将node打上label: node.kubernetes.io/node: “” 和node.kubernetes.io/ingress: “”
172.20.47.4 k3s node, 并将node打上label: node.kubernetes.io/node: “”
其中主机有system标签是用来跑k3s核心应用的,ingress标签用来跑nginx-ingress-controllor, node标签可以跑业务应用
安装镜像仓库registry的playbook:
roles/registry/tasks/state-installed.yml:
roles/registry/templates/config.yml.j2

roles/registry/templates/docker-compose.yml.j2:

 

安装完成后, 可能会造成x509报错,证书报错kubectl unable to connect to server: x509: certificate signed by unknown authority, 可以加 kubectl get no –insecure-skip-tls-verify=true

如果pull 镜像的时候失败,利用以下操作可以解决:

 

二, 运行rancher server并加入k3s集群
参考: https://www.yuque.com/dimension/shu93f/td5aq3
使用 CAShell 生成 CA 证书:https://github.com/yhyddr/CAShell
create_self-signed-cert.sh:

 

通过create.sh脚本来调用上述脚本来生成证书:

 

docker run rancher

如果你只是想试试( rancher 自动签名一个证书供使用)

 

然后选择添加现有集群即可

 

注:

其中可以通过使用cert-manager实现Ingress https

可参考:

https://xuchao918.github.io/2019/03/14/%E4%BD%BF%E7%94%A8cert-manager%E5%AE%9E%E7%8E%B0Ingress-https/

https://blog.indexyz.me/archives/starting-using-k3s/

https://itocm.com/a/879888B9399245969D0AF4ADB403D3F2

 

Categories: KUBERNETES

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *