Service资源是为动态管理的Pod对象添加一个固定访问入口。html
service经过标签选择器关联至拥有相关标签的Pod对象客户端向Service进行请求,而非目标Pod对象,当Service资源变更时,有kube-proxy控制器将规则应用至本机iptables或者ipvs规则。node
而kube-proxy为DaemonSet 控制器将会在集群中每一个节点运行一个Pod或者守护进程 若是须要转换ipvs规则,则须要手动加载ipvs模块进入内核iptables代理模式,对于每一个Service对象,kube-proxy会建立iptables规则直接捕获到达cluster ip和Port流量,并将其重定向至当前Service对象的后端Pod资源,对于每一个Endpoint对象,Service资源会为其建立iptables规则并关联ipvs代理模式 kube-proxy跟踪API server上 Service和Endpoints(ip+port)对象变更,来调用netlink接口建立ipvs规则,并确保于API server中变更同步,于iptables规则不一样之处仅在处于其请求流量的调度功能有ipvs实现,余下的其余功仍然由iptables完成linux
[root@node1 ~]# vim svc.yml apiVersion: v1 kind: Service metadata: name: myapp namespace: prod spec: ports: #ports字段定义svc端口与后端哪一个端口相关连 - name: http #ports字段名称 port: 80 #svc端口 targetPort: 80#目标后端端口 nodePort: 30080 #自定义nodePort端口 selector:#标签选择器 app: myapp rel: stable type: NodePort#NodePort能够定义一个端口给外部范围 #####直接访问svc地址就会调度至后端匹配的标签的pod中即使控制器增长或者减小,svc也会自动关联新增pod [root@node1 chapter5]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d5h myweb NodePort 10.100.112.31 <none> 80:30593/TCP 2d1h [root@node1 chapter5]# kubectl get svc -n prod NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp ClusterIP 10.105.226.215 <none> 80/TCP 2m2s [root@node1 chapter5]# curl 10.105.226.215 Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> [root@node1 chapter5]#
clusterIP:为一个svc分配一个当前集群内的动态地址,客户端pod对象访问服务的Pod对象时不会进行源地址转换,且不会被外部地址访问,只能在集群内部被访问。NodePort:对于某svc来讲会在每一个节点生成一个ipvs规则打开节点端口,映射至svc ip的端口上。还能够手动建立endpoints资源将ip地址指向外部。将名称命名为svc相同时便可nginx
kubectl edit cm kube-proxy -n kube-system
在线修改configmap文件,使其加载ipvs规则git
kubectl delete pod -l k8s-app=kube-proxy,pod-template-generation=1 -n kube-system ##删除pod,让ipvs规则在kube-proxy生效
生效以后的pod会生成ipvs规则。github
标准的api对象,管理外部请求到内部流量。协议为http,仅用域定义流量转发和调度的通用格式的配置信息,它们须要转换为特定的具备http协议转发和调度功能的应用程序的配置文件,并由相应的应用程序生效,相应的配置后完成流量转发web
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml 部署ingress [root@node1 ingress]# vim ingress-svc.yml apiVersion: v1 kind: Service metadata: name: ingress namespace: ingress-nginx spec: selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx ports: - name: http port: 80 - name: https port: 443 type: NodePort
部署svc使其外部网络可以访问至ingressvim
建立后端pod,并为pod指定svc资源后端
[root@node1 ~]# vim myns-ingress.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp namespace: myns spec: replicas: 2 selector: matchLabels: app: myapp rel: beta template: metadata: namespace: myns labels: app: myapp rel: beta spec: containers: - name: myapp image: ikubernetes/myapp:v1 --- apiVersion: v1 kind: Service metadata: name: myapp namespace: myns spec: selector: app: myapp rel: beta ports: - name: http port: 80 targetPort: 80
建立ingress资源,为以前建立的ingress-nginx这个程序提供ingress配置。api
piVersion: extensions/v1beta1 kind: Ingress #资源类型 metadata: #元数据 name: myapp namespace: myns annotations: #此字段为资源注解,做为配置信息提供方 kubernetes.io/ingress.class: "nginx" spec: #定义ingress内部资源 rules: - host: www.node1.com #定义后端主机 - http: ##定义后端资源 paths: - path: / #定义后端映射路径为/ backend: #后端资源 serviceName: myapp #此为svc资源名称 servicePort: 80 #此为svc端口
建立成功,会自动关联至myapp此svc,且会绑定后端资源
此时直接访问宿主机便可访问后端资源使用https访问
openssl genrsa -out myapp.key 2048 ##生成私钥 openssl req -new -x509 -key myapp.key -out myapp.crt -subj /C=CN/ST=Beijing/L=Beijing/O=ops/CN=www.node.com -days 365 #自签名 [root@node1 ~]# kubectl create secret tls ilinux-cert -n myns --cert=myapp.crt --key=myapp.key secret/ilinux-cert created #在集群中建立证书。 ##配置成使用证书的ingress apiVersion: extensions/v1beta1 kind: Ingress metadata: name: tls-ingress namespace: myns annotations: kubernetes.io/ingress.class: "nginx" spec: tls: #引用证书 - hosts: #此主机须要为证书签名时指定的域名一致 - www.node.com secretName: ilinux-cert #secre资源的名称。就是咱们刚才建立的k8s资源 rules: #后端规则,需前一份资源系统 - host: www.node1.com http: paths: - path: / backend: serviceName: myapp servicePort: 80 ############################# [root@node1 ~]# kubectl get ingress -n myns NAME HOSTS ADDRESS PORTS AGE myapp www.node1.com 80 52m tls-ingress www.node.com 80, 443 51s
建立完成
kubectl exec -it nginx-ingress-controller-568867bf56-lrm4f -n ingress-nginx -- /bin/sh##链接至pod内容器,配置文件会自动填充咱们定义的ingress的配置
本文知识点来自于《阿里云技术:云原生基础入门篇》更多内容可点击查看!
有段时间没跟你们分享资源福利了,看了下本身的资料夹,整理了一些我认为比较好的Python学习资料了。相信这套资料能够对你进阶高级工程师有帮助
学习工具
大厂实战手册
自学视频(部分)
【资料免费领取方式】:点这里:2020Python高薪实战学习大合集