設定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 集群內部訪問。
沒有留言:
張貼留言