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 最重要的核心組件之一,主要提供如下的功能
|
k8s.gcr.io/kube-controller-manager 網絡 |
v1.13.4app |
kube-scheduler 負責分配調度 Pod 到集羣內的節點上,它監聽 kube-apiserver,查詢還未分配 Node 的 Pod,而後根據調度策略爲這些 Pod 分配節點(更新 Pod 的 調度器須要充分考慮諸多的因素:
|
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).集羣已經正常運行以下所示;
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
5.查看service 規則;
6.查看由kube-proxy 生成的iptables 防火牆規則; (正常規則)
注意:
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 集羣內進行測試);
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 狀態;
8.ingress 配置;
##配置yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test-ingress spec: rules: - http: paths: - path: / backend: serviceName: test-nginx servicePort: 80
###查看建立 ingress;
####測試訪問###
####基於域名多服務的 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