【A9】rke 部署K8S集群及 Rancher部署

文摘   科技   2023-08-26 12:00   日本  

“A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践。”



01

节点信息


rke 部署 双节点 K8s,用于部署rancher

10.x.xx.115

10.x.xx.116


02

rke部署k8s集群

1、将需要的二进制工具放入 /usr/local/bin/ 下

helm-v3.3.0

kubectl

rke-v1.2.17

ll /usr/local/bin/ | grep "rke|kubectl|helm"



2、创建rancher用户,完成节点互信


useradd ranchergroupadd dockerchown root:docker /var/run/docker.sockusermod -aG docker rancher # 给rancher用户创建密码passwd rancher # 切换到rancher用户,创建公钥,并完成节点互信ssh-keygen  然后一直回车即可ssh-copy-id rancher@10.x.xx.116

3、创建cluster.yml集群配置文件

# 切换到rancher用户,在其家目录下创建 cluster.yml文件# cluster.yml配置文件内容nodes:  - address: 10.x.xx.115           # node air gap network IP    internal_address: 10.x.xx.115    # node intra-cluster IP    user: rancher    role: [ "controlplane", "etcd", "worker" ]    ssh_key_path: /home/rancher/.ssh/id_rsa  - address: 10.x.xx.116           # node air gap network IP    internal_address: 10.x.xx.116    # node intra-cluster IP    user: rancher    role: [ "worker" ]     ssh_key_path: /home/rancher/.ssh/id_rsa private_registries:- url: registry.essence.com.cn  is_default: true kubernetes_version: v1.20.14-rancher2-1 services:  etcd:    extra_args:      auto-compaction-retention: 1        # (单位小时)      quota-backend-bytes: '6442450944'   # 修改空间配额为6442450944,默认2G,最大8G    backup_config:        # 自动备份      enabled: true       # 设置true启用ETCD自动备份,设置false禁用;      interval_hours: 12  # 快照创建间隔时间,不加此参数,默认5分钟;      retention: 6        # etcd备份保留份数;   kube-api:    extra_args:      watch-cache: true      default-watch-cache-size: 1500      # 事件保留时间,默认1小时      event-ttl: 1h0m0s      # 默认值400,设置0为不限制,一般来说,每25~30个Pod有15个并行      max-requests-inflight: 800      # 默认值200,设置0为不限制      max-mutating-requests-inflight: 400      # kubelet操作超时,默认5s      kubelet-timeout: 5s   kube-controller:    extra_args:      # 修改每个节点子网大小(cidr掩码长度),默认为24,可用IP为254个;23,可用IP为510个;22,可用IP为1022个;      node-cidr-mask-size: '24'      # 控制器定时与节点通信以检查通信是否正常,周期默认5s      node-monitor-period: '5s'      ## 当节点通信失败后,再等一段时间kubernetes判定节点为notready状态。      ## 这个时间段必须是kubelet的nodeStatusUpdateFrequency(默认10s)的整数倍,      ## 其中N表示允许kubelet同步节点状态的重试次数,默认40s。      node-monitor-grace-period: '20s'      ## 再持续通信失败一段时间后,kubernetes判定节点为unhealthy状态,默认1m0s。      node-startup-grace-period: '30s'      ## 再持续失联一段时间,kubernetes开始迁移失联节点的Pod,默认5m0s。      pod-eviction-timeout: '1m'      # 默认5. 同时同步的deployment的数量。      concurrent-deployment-syncs: 5      # 默认5. 同时同步的endpoint的数量。      concurrent-endpoint-syncs: 5      # 默认20. 同时同步的垃圾收集器工作器的数量。      concurrent-gc-syncs: 20      # 默认10. 同时同步的命名空间的数量。      concurrent-namespace-syncs: 10      # 默认5. 同时同步的副本集的数量。      concurrent-replicaset-syncs: 5      # 默认5m0s. 同时同步的资源配额数。(新版本中已弃用)      # concurrent-resource-quota-syncs: 5m0s      # 默认1. 同时同步的服务数。      concurrent-service-syncs: 1      # 默认5. 同时同步的服务帐户令牌数。      concurrent-serviceaccount-token-syncs: 5      # 默认30s. 同步deployment的周期。      deployment-controller-sync-period: 30s      # 默认15s。同步PV和PVC的周期。      pvclaimbinder-sync-period: 15s   kubelet:    extra_args:      # 指定pause镜像      pod-infra-container-image: 'rancher/pause:3.1'      # 传递给网络插件的MTU值,以覆盖默认值,设置为0(零)则使用默认的1460      network-plugin-mtu: '1500'      # 修改节点最大Pod数量      max-pods: "250"      # 密文和配置映射同步时间,默认1分钟      sync-frequency: '3s'      # Kubelet进程可以打开的文件数(默认1000000),根据节点配置情况调整      max-open-files: '2000000'      # 与apiserver会话时的并发数,默认是10      kube-api-burst: '30'      # 与apiserver会话时的 QPS,默认是5,QPS = 并发量/平均响应时间      kube-api-qps: '15'      # kubelet默认一次拉取一个镜像,设置为false可以同时拉取多个镜像,      # 前提是存储驱动要为overlay2,对应的Dokcer也需要增加下载并发数,参考[docker配置](/rancher2x/install-prepare/best-practices/docker/)      serialize-image-pulls: 'false'      # 拉取镜像的最大并发数,registry-burst不能超过registry-qps。      # 仅当registry-qps大于0(零)时生效,(默认10)。如果registry-qps为0则不限制(默认5)。      registry-burst: '10'      registry-qps: '0'      cgroups-per-qos: 'true'      cgroup-driver: 'cgroupfs'       # 节点资源预留      enforce-node-allocatable: 'pods'      system-reserved: 'cpu=0.5,memory=1024Mi'      kube-reserved: 'cpu=0.5,memory=1024Mi'       # POD驱逐,这个参数只支持内存和磁盘。      ## 硬驱逐阈值      ### 当节点上的可用资源降至保留值以下时,就会触发强制驱逐。强制驱逐会强制kill掉POD,不会等POD自动退出。      eviction-hard: 'memory.available<256Mi,nodefs.available<10%,imagefs.available<15%,nodefs.inodesFree<5%'      ## 软驱逐阈值      ### 以下四个参数配套使用,当节点上的可用资源少于这个值时但大于硬驱逐阈值时候,会等待eviction-soft-grace-period设置的时长;      ### 等待中每10s检查一次,当最后一次检查还触发了软驱逐阈值就会开始驱逐,驱逐不会直接Kill POD,先发送停止信号给POD,然后等待eviction-max-pod-grace-period设置的时长;      ### 在eviction-max-pod-grace-period时长之后,如果POD还未退出则发送强制kill POD"      eviction-soft: 'memory.available<512Mi,nodefs.available<15%,imagefs.available<20%,nodefs.inodesFree<10%'      eviction-soft-grace-period: 'memory.available=1m30s,nodefs.available=1m30s,imagefs.available=1m30s,nodefs.inodesFree=1m30s'      eviction-max-pod-grace-period: '30'      eviction-pressure-transition-period: '30s'      # 指定kubelet多长时间向master发布一次节点状态。注意: 它必须与kube-controller中的nodeMonitorGracePeriod一起协调工作。(默认 10s)      node-status-update-frequency: 10s      # 设置cAdvisor全局的采集行为的时间间隔,主要通过内核事件来发现新容器的产生。默认1m0s      global-housekeeping-interval: 1m0s      # 每个已发现的容器的数据采集频率。默认10s      housekeeping-interval: 10s      # 所有运行时请求的超时,除了长时间运行的 pull, logs, exec and attach。超时后,kubelet将取消请求,抛出错误,然后重试。(默认2m0s)      runtime-request-timeout: 2m0s      # 指定kubelet计算和缓存所有pod和卷的卷磁盘使用量的间隔。默认为1m0s      volume-stats-agg-period: 1m0s     # 可以选择定义额外的卷绑定到服务    extra_binds:      - "/usr/libexec/kubernetes/kubelet-plugins:/usr/libexec/kubernetes/kubelet-plugins"      - "/etc/iscsi:/etc/iscsi"      - "/sbin/iscsiadm:/sbin/iscsiadm"   kubeproxy:    extra_args:      # 默认使用iptables进行数据转发      proxy-mode: ""      # 与kubernetes apiserver通信并发数,默认10;      kube-api-burst: 20      # 与kubernetes apiserver通信时使用QPS,默认值5,QPS=并发量/平均响应时间      kube-api-qps: 10 ingress:  provider: nginx  options:    use-forwarded-headers: "true"

4、通过RKE工具安装单节点k8s集群


5、配置kubeconfig文件


# 切换到root用户,将生成的kube_config_cluster.yml (kubeconfig文件)配置到指定目录下su rootmkdir /root/.kube && cp /home/rancher/kube_config_cluster.yml /root/.kube/config

[root@rancher115 rancher]# kubectl get node -owideNAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME10.x.xx.115 Ready controlplane,etcd,worker 6d2h v1.20.14 10.x.xx.115 <none> CentOS Linux 7 (Core) 5.4.138-1.el7.elrepo.x86_64 docker://19.3.1510.x.xx.116 Ready worker 6d2h v1.20.14 10.x.xx.116 <none> CentOS Linux 7 (Core) 5.4.138-1.el7.elrepo.x86_64 docker://19.3.15

03

通过helm部署rancher

rancher chart 包:


1、解压缩rancher chart包,修改副本数

在能上网的机器执行获取离线安装包


helm repo add pandaria http://pandaria-releases.cnrancher.com/server-charts/latest

helm fetch pandaria/rancher --version 2.5.12-ent2



2、创建命名空间,创建SSL证书

ssl.key

ssl.pem


# 创建命名空间kubectl create namespace cattle-system

# 创建SSL证书密文kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=ssl.pem --key=ssl.key

# 检查密文NAME TYPE DATA AGEdefault-token-bhzs8 kubernetes.io/service-account-token 3 2m9stls-rancher-ingress kubernetes.io/tls 2 20s


3、部署rancher

# 安装rancher 下面testcluster.xxxx.com 改为你上面ssl的证书域名helm install rancher rancher/ \# --set useBundledSystemChart=true #加上这个参数,避免出现问题处理里面第一种问题--namespace cattle-system \--set hostname=testcluster.xxxx.com \  --set ingress.tls.source=secret \--set rancherRegistry=registry.xxxx.com \--set auditLog.destination=hostPath \--set auditLog.level=3 \--set auditLog.maxAge=7 \--set busyboxImage=registry.xxxxx.com.cn/library/busybox:1.28 \--set rancherImage=registry.xxxxxx.com.cn/cnrancher/rancher

# 查看 rancher[root@rancher115 rancher]# kubectl get pod -n cattle-systemNAME READY STATUS RESTARTS AGErancher-758df94f4f-f9hmm 2/2 Running 0 6d2hrancher-758df94f4f-k77sq 2/2 Running 0 6d2hrancher-758df94f4f-ks6vg 2/2 Running 0 6d2hrancher-webhook-6c959fc5b6-xppml 1/1 Running 0 5d18h


4、访问rancher页面

如果自己有做好域名解析就直接访问即可,没做的就弄下本地host头解析。

# 本地做hosts 解析

10.x.xx.115 testcluster.xxxx.com




04

部署过程中和使用过程中踩过的坑


1、K8S创建时health检测失败


[etcd] Failed to bring up Etcd Plane: etcd cluster is unhealthy: hosts [192.168.100.666] failed to report healthy. Check etcd container logs on each host for more information     这个问题的主要原因还是上个集群的一些配置没有清除,导致配置文件不同步之类的原因,下面的命令在集群的master上执行就行(或者是在安装rancher的机器上执行) 1、docker stop $(docker ps -aq) 2、docker system prune -f 3、docker volume rm $(docker volume ls -q) 4、docker image rm $(docker image ls -q) 5rm -rf /etc/ceph \       /etc/cni \       /etc/kubernetes \       /opt/cni \       /opt/rke \       /run/secrets/kubernetes.io \       /run/calico \       /run/flannel \       /var/lib/calico \       /var/lib/etcd \       /var/lib/cni \       /var/lib/kubelet \       /var/lib/rancher/rke/log \       /var/log/containers \       /var/log/pods \       /var/run/calico


2、rke up失败无法创建同名容器

问题:rke up时出现 failed to create the container name "/rke-worker-port-listener" is already use.....原因:一样是旧集群的配置和容器导致,需要卸载集群后重新部署解决:   rm -rf /var/lib/rancher/etcd/*   rm -rf /etc/kubernetes/*   rke remove --config=/home/rancher/cluster.yml


3、执行kubectl命令报错


问题:执行kubectl命令出现“config not found /etc/kubernetes/admin.conf”原因:/etc/kubernetes/下没生成集群的配置文件解决:  cp /home/rancher/kube_config_cluster.yml /etc/kubernetes/admin.conf

问题:执行kubectl get nodes出现“The connection to the server <host>:6443 was refused - did you specify the right host or port?”解决: sudo -i swapoff -a exit strace -eopenat kubectl version


4、部署服务域名无法解析报错



修改变量

.:53 {

errors

health

ready

kubernetes cluster.local. [in-addr.arpa]() [ip6.arpa]() {

pods insecure

fallthrough [in-addr.arpa]() [ip6.arpa]()

}

hosts {

192.168.1.122 [sample1.xx.com]()

192.168.1.123 [sample2.xx.com]()

fallthrough

}

prometheus :9153

forward . /etc/resolv.conf

cache 30

loop

reload

loadbalance

}

主要是红色部分的添加

重启相关服务


05

鸣谢

感谢同事的教程和我天磊哥一起踩过的坑记录









A9 Team
A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践,期望和朋友们共同进步,守望相助,合作共赢。
 最新文章