2023年10月29日 星期日

建立第一個K8S的Deployment Hello Kubernetes

設定Context

電腦中有2個K8S的環境, 建立Deployment時要注意切換到正確的Context:

  • Docker-Desktop
  • Azure K8S

檢查有效的context

kubectl config get-contexts

輸出: *表示目前使用的Context

CURRENT   NAME                    CLUSTER                 AUTHINFO                                                   NAMESPACE
*         aks-XXX-5ecjl5yhtk5i4   aks-XXX-5ecjl5yhtk5i4   clusterUser_AAA-BBBI-DEV-Service_aks-ccc-5ecjl5yhtk5i4   XXX-dev
          docker-desktop          docker-desktop          docker-desktop

切換到Docker-Desktop
kubectl config use-context <docker-desktop-context-name>

kubectl config use-context docker-desktop

檢查
kubectl config current-context

建立deployment要使用的namespace

kubectl create namespace hello-k8s

kubectl get ns

切換目前Context的namespace

kubectl config set-context --current --namespace=hello-k8s

建立nginx-deployment.yaml

建立cluster到docker-desktop k8

kubectl apply -f nginx-deployment.yaml

yaml內容

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: hello-k8s
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine3.18
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: "1"
            memory: "512Mi"
          requests:
            cpu: "0.5"
            memory: "256Mi"

建立Services: nginx-service.yaml

建立NodePort service來Expose deployment建立cluster到docker-desktop k8

kubectl apply -f nginx-service.yaml

yaml內容

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: hello-k8s
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      nodePort: 30080

驗證是否成功部署

curl http://localhost:30080

Check deployment,pods, service

kubectl get deployments -n hello-k8s
kubectl get pods -n hello-k8s
kubectl get service -n hello-k8s

使用ClusterIP+Ingress

前面範例使用NodePort即可直接訪問http://localhost:30080.
也可改用ClusterIP+Ingress:

nginx-service.yaml

spec:
  type: ClusterIP
  selector:
    app: nginx
...
...

建立Ingress: nginx-ingress.yaml
因為沒有dns, 需修改C:\Windows\System32\drivers\etc\hosts

127.0.0.1 nginx.local
kubectl apply -f nginx-ingress.yaml

yaml內容

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: hello-k8s
spec:
  rules:
  - host: nginx.local
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: nginx-service
            port:
              number: 80

科普Service的type: NodePort

ClusterIP
功能: ClusterIP 是 Kubernetes 預設的服務類型。這種服務類型在集群內分配一個獨特的 IP 地址。它用於集群內部的通信,這意味著它只能從 Kubernetes 集群內部訪問。
使用案例: 當你想要暴露一個僅在 Kubernetes 集群內部訪問的服務時使用 ClusterIP,例如內部 API 或後端服務。
可訪問性: ClusterIP 服務無法直接從 Kubernetes 集群外部訪問。如果需要外部訪問,必須使用其他方法(如 NodePort、LoadBalancer 或 Ingress)。
範例情景: 一個數據庫或僅供同一 Kubernetes 集群內其他 pod 使用的內部 API,而不對外部網路暴露。

NodePort
功能: NodePort 服務是 ClusterIP 的擴展。它在每個節點的 IP 上以一個固定端口(NodePort)暴露服務。NodePort 服務會路由到自動創建的 ClusterIP 服務。這意味著 NodePort 服務使用 <節點IP>:<節點端口> 從集群外部使內部服務可達。
使用案例: 當你想要向外部流量暴露一個服務,且不使用 LoadBalancer 或 Ingress 時使用 NodePort。它是一種簡單的方法,可以從集群外部訪問服務,經常用於開發和測試環境。
可訪問性: 通過 <節點IP>:<節點端口> 在外部訪問。NodePort 是從 --service-node-port-range 指定的範圍(默認:30000-32767)中分配的端口。
範例情景: 暴露一個網絡應用或 API 以供測試,可從 Kubernetes 集群外部訪問。

關鍵差異
可訪問性:
ClusterIP 只能在集群內訪問。
NodePort 可以從集群外部訪問。

端口分配:
ClusterIP 服務不會對外部集群環境暴露端口。
NodePort 服務在集群的所有節點(虛擬機器/實體機器)上開放特定端口。
使用案例:

ClusterIP 非常適合於服務無需對集群外部暴露的情況。
NodePort 適合於開發/測試環境,需要對外部訪問服務時。

服務鏈:
NodePort 服務可以訪問 ClusterIP 服務,因為它們是其上層。
在您使用 Docker Desktop 的場景中,使用 NodePort 服務在開發和測試中很方便,因為它允許您從本機機器瀏覽器或使用像 curl 這樣的工具訪問 Nginx 服務。如果您使用 ClusterIP,則該服務只能從 Kubernetes 集群內部訪問。

沒有留言:

張貼留言