Install k3s
curl -sfL https://get.k3s.io | sh -s - server --disable traefik #使用国内源安装指定版本 curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \ INSTALL_K3S_MIRROR=cn \ INSTALL_K3S_VERSION=v1.29.5+k3s1 \ sh -s - \ --tls-san k3s.yousri.me \ --service-node-port-range 5000-32767 \ --cluster-cidr 10.20.0.0/16 \ --service-cidr 10.21.0.0/16 \ --disable-helm-controller \ --disable traefik
默认启动组件包括
coredns / servicelb / traefik / local-path / metrics-server 等CoreDNSDNS解析功能;
servicelb提供类似云厂商外部统一访问入口负载均衡器LoadBalancer机制功能的本地负载均衡器(类似比如MetalLB);
traefik作为提供ingress controller路由访问控制器功能;(这里个人disable traefik默认禁用,因为考虑手动配置其他控制器,比如ingress-nginx-controller/apisix-ingress-controller等)
服务暴露访问几种方式:(前提有支持
LoadBalancer 功能的情况下)Client—>LoadBalancer—>Service—>Pod—>Container- 直接将 Service 暴露给外部网络;
- 将
Service设置type为LoadBalancer类型情况,每个Service会获得一个独立的外部 IP 地址可直接暴露访问; - 该方式更适合
单个服务/简单特殊的使用场景,比如下面Ingress统一入口服务; - 其中
LoadBalancer负载均衡器实例通常由云提供商或如这里 k3s 的servicelb等组件管理,其他第三方比如MetalLB;
Client—>LoadBalancer—>Ingress-Controller—>Service—>Pod—>Container- 这里经由
Ingress提供HTTP和HTTPS路由,可以将多个服务暴露在同一个外部 IP 地址下,通过URL路径或主机名domain来区分不同的服务; - 需要一个
Ingress控制器来处理Ingress资源,例如Ingress Nginx Controller/Traefik/Apisix Ingress Controller等; - 该方式更适用于需要通过单一入口点管理多个服务的使用场景,比如统一网关功能等;
Ingress控制器通常与LoadBalancerService 结合使用,将控制器本身暴露给外部网络;
拓扑图
注意:如果没有云厂商提供的负载均衡器或本地不支持
LoadBalancer 的话,那 Service 要暴露外部网络访问的话就只能使用 NodePort 的方式,这种情况可以考虑上面第二个方式,将 Ingress 控制器 NodePort 暴露固定的端口给外部网络访问,前面额外增加个四层或七层 Nginx / Haproxy 的服务代理到 Ingress 控制器的 NodePort 端口服务上:Client—>Nginx/HaProxy—>Ingress-Controller(NodePort)—>Service—>Pod—>Container
Ingress Controller 控制器相关
因为上面安装
k3s 是选择禁用了默认的 Traefix 功能,遂这里需要选择手动安装个 Ingress Nginx Controller 作为入口路由控制器,比如:(直接使用 Manifests 方式部署)Install Ingress Nginx Controller
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml
Kubernetes 1.18+ 版本后,默认情况下
Ingress 资源可能不会自动关联到特定的 IngressClass,因此需要显式地指定 IngressClass ,在 Ingress 资源中指定 IngressClassName。Add Ingress For AgroCD Web UI
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: test.yousri.me http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80
可以手动设置
默认 的 IngressClass 为 Ingress Nginx Controller 如:Setting Defaultt IngressClass
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: nginx annotations: ingressclass.kubernetes.io/is-default-class: "true" spec: controller: k8s.io/ingress-nginx
安装配置 Argo 组件服务
Install ArgoCD
$kubectl create namespace argo $kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml # 获取默认密码 $kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo # 修改默认密码 需要安装 argocd cli 客户端工具 $argocd account update-password --account admin --current-password xxxx --new-password xxxx
配置 Ingress 路由访问 ArgoCD 后台管理 Web UI 页面,不同控制器配置可参考 Ingress Configuration
# 创建 tls 的 https 证书 secret $kubectl create secret tls yousri-tls --cert=yousri.me.crt --key=yousri.me.key -n argo
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: argocd-ingress namespace: argo annotations: #nginx.ingress.kubernetes.io/force-ssl-redirect: "false" nginx.ingress.kubernetes.io/ssl-passthrough: "true" nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" #nginx.ingress.kubernetes.io/backend-protocol: "HTTP" #nginx.ingress.kubernetes.io/backend-protocol: "gRPC" spec: ingressClassName: nginx rules: - host: argocd.yousri.me http: paths: - path: / pathType: Prefix backend: service: name: argocd-server port: number: 443 tls: - hosts: - argocd.yousri.me secretName: unisco-tls
管理使用 ArgoCD
安装
ArgoCD CLI 客户端命令行工具brew install argocd
获取初始密码并登录,修改更新
$kubectl -n argo get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo $argocd login argocd.yousri.me --username admin --password ${argocd-initial-admin} --grpc-web $argocd account update-password