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
# 未完待续