Service
工作模式: userspace,iptables,ipvs
類型:
1. ExternalName: 用於將集群外部的服務引入到集群內部,在集群內部可直接訪問來獲取服務。
它的值必須是 FQDN, 此FQDN為集群內部的FQDN, 即: ServiceName.Namespace.Domain.LTD.
然后CoreDNS接受到該FQDN后,能解析出一個CNAME記錄, 該別名記錄為真正互聯網上的域名.
如: www.test.com, 接着CoreDNS在向互聯網上的根域DNS解析該域名,獲得其真實互聯網IP.
2. ClusterIP: 用於為集群內Pod訪問時,提供的固定訪問地址,默認是自動分配地址,可使用ClusterIP關鍵字指定固定IP.
3. NodePort: 用於為集群外部訪問Service后面Pod提供訪問接入端口.
這種類型的service工作流程為:
Client----->NodeIP:NodePort----->ClusterIP:ServicePort----->PodIP:ContainerPort
4. LoadBalancer: 用於當K8s運行在一個雲環境內時,若該雲環境支持LBaaS,則此類型可自動觸發創建
一個軟件負載均衡器用於對Service做負載均衡調度.
因為外部所有Client都訪問一個NodeIP,該節點的壓力將會很大, 而LoadBalancer則可解決這個問題。
而且它還直接動態監測后端Node是否被移除或新增了,然后動態更新調度的節點數。
資源記錄
SVC_NAME.NS_NAME.DOMAIN.LTD.
特定域名后綴 svc.cluster.local. redis.default.svc.cluster.local.
# 修改會話粘性
Kubectl path svc myapp -p ‘{“spec”:{“sessionAffinity”:”ClientIp”}}’
# 解析地址
dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10
實現ipvs代理
vim /etc/sysconfig/kubelet
KUBE_PROXY_MODE=ipvs
ip_vs, ip_vs_rr, ip_vs_sh, ip_vs_wrr, nf_conntrack_ipv4
Ingress Controller七層調度
HAProxy、默認使用Nginx 、服務網格 Envoy 、微服務 Traefik
1、根據域名做負載到不同服務
2、url映射 /eshop /bbs /api 不同服務
功能
# 暴露端口
負載均衡:ingress-nginx kind:service namespace: ingress-nginx
# 負7層代理
Pod名稱:nginx-ingress-controller-5bb8fb4bb6-k2x28 kind:POD namespace: ingress-nginx
# 對象轉發配置模板 主機或者 api路徑 https
名稱: ingress-myapp kind:ingress namespace: default
# 負載Pod 后端群組
service myapp default
# selector 選擇Pod
deployment Pod: deployment-demo default
# 安裝nginx-ingress
# 參考連接 https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/docs/deploy/index.md
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
kubectl create –f mandatory.yaml
kubectl create –f service-nodeport.yaml
POD_NAMESPACE=ingress-nginx
POD_NAME=$(kubectl get pods -n $POD_NAMESPACE -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].metadata.name}')
kubectl exec -it $POD_NAME -n $POD_NAMESPACE -- /nginx-ingress-controller --version
# Service Pod apiVersion: v1 kind: Service metadata: name: tomcat namespace: default spec: selector: app: tomcat release: canary ports: - name: http port: 8080 targetPort: 8080 - name: ajp targetPort: 8009 port: 8009 --- apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deploy namespace: default spec: replicas: 3 selector: matchLabels: app: tomcat release: canary template: metadata: labels: app: tomcat release: canary spec: containers: - name: tomcat-myapp image: tomcat:8 ports: - name: http containerPort: 8080 - name: ajp containerPort: 8009
# ingress apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-mytomcat namespace: default annotations: kubernets.io/ingress.class: "nginx" spec: rules: - host: tomcatnode http: paths: - path: backend: serviceName: tomcat servicePort: 8080
# 生成自簽證書
openssl genrsa -out tls.key 2048
openssl req -new -x509 -key tls.key -out tls.crt –subj /C=CN/ST=Beijing/L=Beijing/O=Devops/CN=tomcatnode
# 創建密鑰關聯證書
kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key
# 創建 ingress關聯證書 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-mytomcat-tls namespace: default annotations: kubernets.io/ingress.class: "nginx" spec: tls: - hosts: - tomcatnode secretName: tomcat-ingress-secret rules: - host: tomcatnode http: paths: - path: backend: serviceName: tomcat servicePort: 8080
# 未完待續