0x00 Target
基于AWS EKS 集群,部署目前最新版(v2.9.0)Rancher 。
使用从阿里云购买的SSL证书。
主要参考: https://purushothamkdr453.medium.com/installing-rancher-on-aws-eks-cluster-ec6199e297e4
Rancher K8s 支持矩阵: https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/rancher-v2-8-5/
0x01 Create A New Cluster
- create a 3 nodes cluster with low spec.
eksctl create cluster \
--name rancher \
--version=1.28 \
--region us-west-2 \
--nodegroup-name rancher-nodegroup \
--node-type t2.medium \
--nodes 3 \
--nodes-min 1 \
--nodes-max 5 \
--managed
This step will take 20 mins
- update kubeconfig
aws eks --region us-west-2 update-kubeconfig --name rancher
0x02 Deploy Nginx Controller
# config helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# install
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --set controller.service.type=LoadBalancer \
--create-namespace
- check svc
kubectl get svc -A
0x03 Install SSL Cert
- 从阿里云SSL证书中心下载nginx 证书,包含两个文件: a.key, a.pem
- 先把.key 转成 .pem
openssl rsa -in a.key -text > key.pem
- 导入 ssl证书
kubectl create ns cattle-system
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=a.pem --key=key.pem
上述SSL证书,会在后面的ingress配置中使用。
0x04 Deploy Rancher
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
helm repo update
# install
helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname=${you-domain} \
--set ingress.tls.source=secret \
--set ingress.ingressClassName=nginx
0x05 Update DNS config
- get svc public lb endpoint
kubectl get svc -A
- update your dns config
然后正常情况下,已经可以正常访问Rancher UI了。
0x06 安全配置&SSL更新
默认情况下,eks 和 lb 都是面向公网访问的,生产环境下,你需要进行白名单IP配置。
kubectl -n cattle-system create secret tls tls-rancher-ingress \
--cert=new.pem\
--key=newkey.pem \
--dry-run --save-config -o yaml | kubectl apply -f -
然后,重启 rancher deployment
kubectl rollout restart deploy/rancher -n cattle-system
0x07 Q&A
- 如果发现 rancher pod实例启动失败时,需要导入下面的权限补丁:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
annotations:
meta.helm.sh/release-name: rancher
meta.helm.sh/release-namespace: cattle-system
finalizers:
- wrangler.cattle.io/auth-prov-v2-crb
labels:
app: rancher
app.kubernetes.io/managed-by: Helm
chart: rancher-2.9.0
heritage: Helm
release: rancher
name: rancher
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: rancher
namespace: cattle-system
- 重置 Rancher Amdin 密码
万一哪天 rancher admin 密码忘记了,可以通过 kubectl 进行重置。
kubectl -n cattle-system exec $(kubectl -n cattle-system get pods -l app=rancher | grep '1/1' | head -1 | awk '{ print $1 }') -- reset-password
rancher 卸载
官方提供了卸载工具: https://github.com/rancher/rancher-cleanup-
rancher agent 问题
level=error msg="unable to read CA file from /etc/kubernetes/ssl/certs/serverca: open /etc/kubernetes/ssl/certs/serverca: no such file or directory"
在Rancher设置那边切换 agent 端的证书验证方式: SystemStore
K8s 版本
EKS 升级至1.30
版本亲测可用
0x08 ArgoCD 部署
参考:https://argo-cd.readthedocs.io/en/stable/getting_started/
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
0x09 ArgoCD SSL配置
参考:https://argo-cd.readthedocs.io/en/stable/operator-manual/tls/
kubectl edit cm argocd-cmd-params-cm -n argocd
增加
data:
server.insecure: "true"
重启 server:
kubectl rollout restart deploy argocd-server -n argocd
0x0A ArgoCD Ingress配置
复用上面rancher 生成的 elb , 我们新建一个域名绑定: argocd.domain.
由于 rancher 和 argocd 在不同的 namespace下面,所以手动复制一下 rancher 下面的 ssl 证书 secret 至 argocd namespace.
然后,执行下面的 yaml, 相当于在nginx 配置一个外部ssl访问,内部使用 80 端口转发流量
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: HTTP
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
labels:
app: argocd-server
name: argocd-server
namespace: argocd
spec:
ingressClassName: nginx
rules:
- host: {argocd.domain}
http:
paths:
- backend:
service:
name: argocd-server
port:
name: http
path: /
pathType: ImplementationSpecific
tls:
- hosts:
- {argocd.domain}
secretName: tls-rancher-ingress
status:
loadBalancer:
ingress:
- hostname: {rancher-elb}.us-west-2.elb.amazonaws.com
0x0B ArgoCD 登录
argocd 默认的 admin 密码存储在 argocd namespace 下面的 secret 中
可以这样直接获取,查完后安全起见应该立刻删掉。
kubectl get secret -n argocd argocd-initial-admin-secret -o json | jq -r .data.password | base64 -d
备忘: