K8S原來如此簡單(四)Service+Ingress


上一篇我們通過deployment實現了pod的橫向擴展,但是仍然不能負載,也不能對外提供服務,現在我們來看看如何通過k8s實現負載與外網訪問

Service

service為一組pod提供一個統一的入口,實現負載,也可實現外部訪問。

原理

 在Kubernetes集群的每個Node上都會運行一個kube-proxy服務進程,kube-proxy會通過我們定義的service,自動生成iptables規則,這樣就能將到某個Service的訪問請求轉發到后端的多個Pod實例上。

Service類型

ClusterIP

通過集群的內部 IP 暴露服務,選擇該模式時服務只能夠在集群內部訪問。 這也是默認的 ServiceType。

 

NodePort

通過每個節點上的 IP 和靜態端口(NodePort)暴露服務。NodePort 服務會路由到自動創建的 ClusterIP 服務。 通過請求 <節點 IP>:<節點端口>,你可以從集群的外部訪問一個 NodePort 服務。

LoadBalancer

使用雲提供商的負載均衡器向外部暴露服務。 外部負載均衡器可以將流量路由到自動創建的 NodePort 服務和 ClusterIP 服務上。

 

Service的Cluster IP與NodePort等概念是kube-proxy服務通過iptables 的NAT轉換實現的。kube-proxy在運行過程中動態創建與Service相關的 iptables規則,這些規則實現了將訪問服務(Cluster IP或NodePort)的請 求負載分發到后端Pod的功能。

 

kubeadm方式修改ipvs模式:

kubeadm方式修改ipvs模式:
kubectl edit configmap kube-proxy -n kube-system

...
mode: “ipvs“
...

定義Service

創建一個ClusterIP的service

apiVersion: v1
kind: Service
metadata:
  name: chesterservice
  namespace: chesterns
spec:
  selector:
    app: chesterapi
  ports:
    - protocol: TCP
      port: 5000
      targetPort: 5000

 

部署service,並通過service訪問oneapi

kubectl apply -f service.yaml
kubectl get service -n chesterns
kubectl describe service chesterservice -n chesterns
curl clusterip:5000/test

clusterip模式的service不能通過外網訪問,我們來定義一個nodeport模式的service,實現外部訪問

apiVersion: v1
kind: Service
metadata:
  name: chesterservice
  namespace: chesterns
spec:
  type: NodePort
  selector:
    app: chesterapi
  ports:
    - protocol: TCP
      port: 5000
      targetPort: 5000
      nodePort: 30111
kubectl delete -f service.yaml
kubectl apply -f service.yaml
kubectl get service -n chesterns
kubectl describe service chesterservice -n chesterns
curl nodeip:30111/test

 

服務發現

k8s通過兩種方式實現服務的發現

環境變量

當 Pod 運行在 Node 上,kubelet 會為每個活躍的 Service 添加一組環境變量

{SVCNAME}_SERVICE_HOST

{SVCNAME}_SERVICE_PORT

通過以下命令即可看到

kubectl get pod -n chesternskubectl exec chesterdeployment-6d89bc6b45-c5vbv  -n chesterns -- env
DNS

CoreDNS 是一種靈活的,可擴展的 DNS 服務器,可以 安裝為集群內的 Pod 提供 DNS 服務。

ClusterIP A記錄格式:

<service-name>.<namespace-name>.svc.cluster.local

示例:

my-svc.my-namespace.svc.cluster.local

Ingress

NodePort存在端口不足,只支持4層負載(IP:Port)不支持7層網絡負載的缺點。Ingress為了彌補這些缺點而生。

對於基於HTTP的服務來說,不同的URL地址經常對應到不同的后端服務或者虛擬服務器(Virtual Host),這些應用層的轉發機制僅通過Kubernetes的Service機制是無法實現的。

使用Ingress進行負載分發時,Ingress Controller基於Ingress規則將客戶端請求直接轉發到Service對應的后端Endpoint(Pod)上,這樣會跳過kube-proxy的轉發功能,kube-proxy不再起作用。如果Ingress Controller提供的是對外服務,則實際上實現的是邊緣路由器的功能。

 

 

Ingress Nginx

Ingress nginx是我們常用的一種ingress controller,他的原理是監聽Ingress資源,把用戶定義的Ingress轉移成Nginx的配置信息

核心代碼如下

 

安裝Ingress Nginx

通過以下鏈接下載yaml文件:

https://kubernetes.github.io/ingress-nginx/deploy/

創建Ingress Controller

kubectl apply -f nginx-ingress.yamlkubectl get pods --namespace=ingress-nginx

創建Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: chesteringress
  namespace: chesterns
  annotations:
   kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: chester.k8s.com
    http:
      paths:
      - pathType: Prefix
        path: "/test"
        backend:
         service:
          name: chesterservice
          port:
           number: 5000

部署

kubectl apply -f ingress.yaml

查看nginx配置信息,判斷ingress是否生效

kubectl cp ingress-nginx-controller-58fccdc57c-gzkns:/etc/nginx/nginx.conf /tmp/nginx.conf -n ingress-nginx
cat /tmp/nginx.conf

配置hosts

kubectl get pods --namespace=ingress-nginx -o wide

vi /etc/hosts
(ingress-nginx-controller的集群ip) chester.k8s.com

測試訪問

curl chester.k8s.com/test/

為Ingress配置https

配置HTTPS步驟:

  1. 准備域名證書文件(來自:openssl/cfssl工具自簽或者權威機構頒發)

  2. 將證書文件保存到Secret

kubectl create secret tls chestertlssecret -- cert=chester.k8s.com.pem --key=chester.k8s.com-key.pem
  1. Ingress規則配置tls

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: chesteringress
spec:
 tls:
 - hosts:
   - chester.k8s.com
   secretName: chestertlssecret
 rules:
 - host: chester.k8s.com
   http:
    paths:
    - path: /
      pathType: Prefix
      backend:
       service:
        name: web
        port:
         number: 80


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM