📒

Learning with k3s on HomeLab

Created
Jun 28, 2024 03:30 PM
Tags
cloudnative
kubernetes
k3s
 

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
  • CoreDNS DNS解析功能;
  • servicelb 提供类似云厂商外部统一访问入口负载均衡器 LoadBalancer 机制功能的本地负载均衡器(类似比如 MetalLB );
  • traefik 作为提供 ingress controller 路由访问控制器功能;(这里个人 disable traefik 默认禁用,因为考虑手动配置其他控制器,比如 ingress-nginx-controller / apisix-ingress-controller 等)
 
服务暴露访问几种方式:(前提有支持 LoadBalancer 功能的情况下)
  • Client —> LoadBalancer —> Service —> Pod —> Container
    • 直接将 Service 暴露给外部网络;
    • Service 设置 typeLoadBalancer 类型情况,每个 Service 会获得一个独立的外部 IP 地址可直接暴露访问;
    • 该方式更适合 单个服务 / 简单特殊 的使用场景,比如下面 Ingress 统一入口服务;
    • 其中 LoadBalancer 负载均衡器实例通常由云提供商或如这里 k3s 的 servicelb 等组件管理,其他第三方比如 MetalLB
  • Client —> LoadBalancer —> Ingress-Controller —> Service —> Pod —> Container
    • 这里经由 Ingress 提供 HTTPHTTPS 路由,可以将多个服务暴露在同一个外部 IP 地址下,通过 URL 路径或主机名 domain 来区分不同的服务;
    • 需要一个 Ingress 控制器来处理 Ingress 资源,例如 Ingress Nginx Controller / Traefik / Apisix Ingress Controller 等;
    • 该方式更适用于需要通过单一入口点管理多个服务的使用场景,比如统一网关功能等;
    • Ingress 控制器通常与 LoadBalancer Service 结合使用,将控制器本身暴露给外部网络;
    • 拓扑图
      notion image
注意:如果没有云厂商提供的负载均衡器或本地不支持 LoadBalancer 的话,那 Service 要暴露外部网络访问的话就只能使用 NodePort 的方式,这种情况可以考虑上面第二个方式,将 Ingress 控制器 NodePort 暴露固定的端口给外部网络访问,前面额外增加个四层或七层 Nginx / Haproxy 的服务代理到 Ingress 控制器的 NodePort 端口服务上:
  • Client —> Nginx / HaProxy —> Ingress-ControllerNodePort )—> 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
可以手动设置 默认IngressClassIngress 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
 

参考文档