k8s 之 應用實踐-Service,Ingress

1.背景;node

        因爲簡化部署k8s 集羣 ,公司的k8s 部署方案使用的是 kubeadm ,且跟進線上線下維度進行集羣劃分,爲什麼要使用kubeadm 主要有兩個緣由:1.部署方便快捷,2.k8s節點擴容方便  3.部署難度下降; 
python


2.系統環境;linux


系統版本 內核版本 etcd  備註
CentOS Linux release 7.5.1804 3.10.0-862.14.4.el7.x86_64 etcdctl version: 3.3.11





3.相關組件版本;nginx


kubeadmin 組件名稱 組件版本名稱 備註



k8s.gcr.io/kube-apiserver git



v1.13.4github

kube-apiserver 是 Kubernetes 最重要的核心組件之一,主要提供如下的功能
  • 提供集羣管理的 REST API 接口,包括認證受權、數據校驗以及集羣狀態變動等後端

  • 提供其餘模塊之間的數據交互和通訊的樞紐(其餘模塊經過 API Server 查詢或修改數據,只有 API Server 才直接操做 etcd)api






k8s.gcr.io/kube-controller-manager 網絡





v1.13.4app

kube-scheduler 負責分配調度 Pod 到集羣內的節點上,它監聽 kube-apiserver,查詢還未分配 Node 的 Pod,而後根據調度策略爲這些 Pod 分配節點(更新 Pod 的 NodeName 字段)

調度器須要充分考慮諸多的因素:

  • 公平調度

  • 資源高效利用

  • QoS

  • affinity 和 anti-affinity

  • 數據本地化(data locality)

  • 內部負載干擾(inter-workload interference)

  • deadlines


k8s.gcr.io/kube-scheduler


v1.13.4

Controller Manager 由 kube-controller-manager 和 cloud-controller-manager 組成,是 Kubernetes 的大腦,它經過 apiserver 監控整個集羣的狀態,並確保集羣處於預期的工做狀態。



 k8s.gcr.io/kube-proxy



v1.13.4

每臺機器上都運行一個 kube-proxy 服務,它監聽 API server 中 service 和 endpoint 的變化狀況,並經過 iptables 等來爲服務配置負載均衡(僅支持 TCP 和 UDP)。

kube-proxy 能夠直接運行在物理機上,也能夠以 static pod 或者 daemonset 的方式運行。

k8s.gcr.io/pause 3.1

Kubernetes爲每一個Pod都附屬了gcr.io/google_containers/pause:latest,這個容器只接管Pod的網絡信息,業務容器經過加入網絡容器的網絡來實現網絡共享。此容器隨着pod建立而建立,隨着Pod刪除而刪除,正如其名字「pause」

該容器是對業務pod的命名空間的解析。


k8s.gcr.io/coredns 1.2.6 DNS 是 Kubernetes 的核心功能之一,經過 kube-dns 或 CoreDNS 做爲集羣的必備擴展來提供命名服務。


weaveworks/weave

2.5.2

Weave Net是一個多主機容器網絡方案,支持去中心化的控制平面,各個host上的wRouter間經過創建Full Mesh的TCP連接,並經過Gossip來同步控制信息。這種方式省去了集中式的K/V Store,可以在必定程度上減低部署的複雜性,



4.應用實踐;


(1).集羣已經正常運行以下所示;


image.png


2.查看deployment 配置;

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
  name: nginx-dp
spec: 
  selector:
    matchLabels:
      app: nginx-dp
  replicas: 1
  template: 
    metadata: 
      labels: 
        app: nginx-dp 
    spec: 
      containers: 
        - name: nginx 
          image: nginx:alpine 
          ports: 
            - containerPort: 80


3.查看ervice 配置;


apiVersion: v1
kind: Service
metadata:
  name: nginx-dp-cpf
spec:
  type: NodePort
  ports:
  - nodePort: 30001
    port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: nginx-dp


4.查看生成endpoints 


image.png


5.查看service 規則;

image.png


6.查看由kube-proxy 生成的iptables 防火牆規則; (正常規則)

image.png


注意:

      1.若是防火牆規則出現 相似以下規則:

        -A KUBE-EXTERNAL-SERVICES -p tcp -m comment --comment "default/nginx-dp-cpf: has no endpoints" -m addrtype --dst-type LOCAL -m tcp --dport 30001 -j REJECT --reject-with icmp-port-unreachable

      2.解決辦法;

           (1).net.ipv4.ip_forward = 1  #系統內核路由轉發功能

           (2).iptables -P FORWARD ACCEPT  #容許 iptables  FORWARD 鏈規則經過;

           (3).iptables -P OUTPUT ACCEPT  #容許 iptables  OUTPUT 鏈規則經過;

           (4).檢查deployment labels  和 service labels 設置是否關聯正確;

           (5).kubectl get endpoints  --show-labels  #注意此規則和防火牆規則匹配 若出現none 請檢查防火牆規則;


7.進行功能測試 (k8s 集羣內進行測試);

image.png


8.ingress 部署;

#master 端執行;
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml

注意: 

      nodeSelector 字段 labels  和 node labels 關聯; 不然運行ingres pod 出現 peding 狀態;

image.png


image.png


8.ingress 配置;

##配置yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: test-nginx 
          servicePort: 80


###查看建立 ingress;

image.png

####測試訪問###

image.png


####基於域名多服務的 Ingress

路由到多服務的 Ingress 即根據請求路徑的不一樣轉發到不一樣的後端服務上,好比

www.breaklinux.com -> 10.109.21.77-> /test1     s1:80
                                  —> /test2      s2:80
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
spec:
  rules:
  - host: www.breaklinux.com
    http:
      paths:
      - path: /test1
        backend:
          serviceName: test-nginx
          servicePort: 80
      - path: /test2
        backend:
          serviceName: nginx-dp-test-01 
          servicePort: 80

###虛擬主機 Ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: ""
    nginx.ingress.kubernetes.io/proxy-body-size: 10240m
    nginx.ingress.kubernetes.io/proxy-read-timeout: "36000"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "36000"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
  name: test-nginx-ingess
spec:
  rules:
  - host: test-nginx-ingress.dev.k8s.chj.cloud
    http:
      paths:
      - backend:
          serviceName: test-nginx
          servicePort: 80 
        path: /?(.*)

  ##基於虛擬主機訪問測試#

##由於沒有dns 服務環境 綁定hosts 進行測試

cat /etc/hosts

10.109.21.77   www.breaklinux.com test-nginx-ingress.dev.k8s.chj.cloud

image.png

相關文章
相關標籤/搜索