ขยายร่างโรงงานซอฟต์แวร์สู่ Kubernetes (K3s) โดยจะเป็นการยกตัวอย่าง แบบ 2 Node เพื่อรองรับระบบ GitOps และ SSL อัตโนมัติ
การวางแผนทรัพยากรบน Cloud VPS (6 vCPU, 12GB RAM) จำนวน 2 เครื่อง
วิธีการติดตั้งที่แนะนำ ได้แก่ เลือกใช้ Manual Install (K3s) เพื่อให้ได้ประสิทธิภาพสูงสุด ประหยัด RAM และลดความซ้ำซ้อนของซอฟต์แวร์ที่ไม่จำเป็น
ก่อนเริ่มติดตั้ง ต้องเตรียม "ที่อยู่" (A Record) ให้พร้อมเพื่อให้ระบบเรียกหากันเจอและทำ SSL ได้
สร้างประสบการณ์ "คลิกเดียวได้ SSL" ด้วยมาตรฐาน Kubernetes โดยเราจะใช้ Ingress-Nginx ภายใน K3s ซึ่งจะทำงานร่วมกับ cert-manager ลำดับขั้นตอนการติดตั้ง ดังนี้
การติดตั้งโรงงานซอฟต์แวร์ (ฉบับปฏิบัติจริง)
เพื่อเรียนรู้การติดตั้งแบบ Manual Install (K3s)
curl -sfL https://get.k3s.io | sh -s - \
--write-kubeconfig-mode 644 \
--disable traefik \
--disable servicelb \
--tls-san rancher.panmodel.com \
--tls-san argocd.panmodel.com
kubectl get nodes
cat /var/lib/rancher/k3s/server/node-token
curl -sfL https://get.k3s.io | K3S_URL=https://<IP_เครื่อง_1>:6443 K3S_TOKEN=<TOKEN> sh -
kubectl get nodes
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
echo "export KUBECONFIG=/etc/rancher/k3s/k3s.yaml" >> ~/.bashrc
source ~/.bashrc
helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace
kubectl get pods -n ingress-nginx
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set installCRDs=true
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: อีเมลทั่วไปได้
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
kubectl apply -f cluster-issuer.yaml
kubectl -n ingress-nginx get svc ingress-nginx-controller
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.hostPort.enabled=true \
--set controller.service.type=NodePort \
--set controller.kind=DaemonSet
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml --server-side
kubectl get pods -n argocd
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-server-ingress
namespace: argocd
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- argocd.panmodel.com
secretName: argocd-server-tls
rules:
- host: argocd.panmodel.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 443
kubectl apply -f argocd-ingress.yaml
kubectl get certificate -n argocd
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
kubectl create namespace cattle-system
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: rancher-tls
namespace: cattle-system
spec:
secretName: rancher-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
commonName: rancher.panmodel.com
dnsNames:
- rancher.panmodel.com
kubectl apply -f rancher-cert.yaml
kubectl -n cattle-system get certificate rancher-tls
helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname=rancher.panmodel.com \
--set ingress.tls.source=secret \
--set ingress.ingressClassName=nginx \
--set secretName=rancher-tls \
--set bootstrapPassword=admin \
--set replicas=1
kubectl get pods -n cattle-system
kubectl describe ingress rancher -n cattle-system
kubectl get secret rancher-tls -n cattle-system -o yaml | \
sed 's/name: rancher-tls/name: tls-rancher-ingress/' | \
kubectl apply -f -
kubectl get secret rancher-tls -n cattle-system -o yaml | sed 's/name: rancher-tls/name: tls-rancher-ingress/' | kubectl apply -f -
การทำให้โรงงาน Software Factory กลายเป็นระบบอัตโนมัติ (Fully Automated) โดยการนำทุกจิ๊กซอว์ที่เรามี (GitLab, Jenkins, Nexus, ArgoCD, K3s, Rancher) มาต่อกันเป็นภาพที่สมบูรณ์แบบ "End-to-End"