k8s集群安装学习笔记四——Server部分
简介:
Service 的概念
ipvs 代理模式
ClusterIP
Headless Service
NodePort
LoadBalancer
ExternalName
Service-Ingress
Service 的概念





[root@master manifests]# vim myapp-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deploy namespace: default spec: replicas: 3 selector: matchLabels: #匹配(app=myapp并且release=stabel的即可) app: myapp release: stabel template: metadata: labels: app: myapp release: stabel env: test spec: containers: - name: myapp image: wangyanglinux/myapp:v2 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80
kubectl apply -f myapp-deployment.yaml
[root@master manifests]# vim myapp-service.yaml apiVersion: v1 kind: Service metadata: name: myapp namespace: default spec: type: ClusterIP selector: #匹配到的标签的pod才能通过svc访问到 app: myapp release: stabel ports: - name: http port: 80 targetPort: 80
kubectl apply -f myapp-service.yaml
当然也可以直接通过yaml文件的方式直接删除资源
kubectl delete -f myapp-service.yaml

查看ipvs负载信息
ipvsadm -Ln

访问svc(轮询访问)
- 主要的特点是通过无头服务的方式去解决hostname和portname的变化问题,也就是通过它去进行绑定。
[root@k8s-master mainfests]# vim myapp-svc-headless.yaml
apiVersion: v1 kind: Service metadata: name: myapp-headless namespace: default spec: selector: app: myapp clusterIP: "None" ports: - port: 80 targetPort: 80
kubectl apply -f myapp-svc-headless.yaml
获取当前dns的地址信息
安装dig命令
yum -y install bind-utils
添加A记录域名解析
[root@k8s-master mainfests]# dig -t A myapp-headless.default.svc.cluster.local. @10.96.0.7
查看网络
虽然None服务无法通过svc访问,但是还是可以通过域名访问至上面这几个不同的pod。域名为:myapp-headless.default.svc.cluster.local
[root@master manifests]# vim nodeport.yaml apiVersion: v1 kind: Service metadata: name: myapp namespace: default spec: type: NodePort selector: app: myapp release: stabel ports: - name: http port: 80 #和clusterIP对应,即ip:8080,供内部访问 targetPort: 80 #端口一定要和container暴露出来的端口对应 nodePort: 32143 #所有的节点都会开放此端口,此端口供外部调用
查看服务器相应端口
外部访问:
Node服务器IP:30715 即可 (所有node服务器都可这样访问到)
iptables -t nat -nvL KUBE-NODEPORTS

$ vim ex.yaml
kind: Service apiVersion: v1 metadata: name: my-service-1 namespace: default spec: type: ExternalName externalName: hub.atguigu.com #公网上可用的域名
$ kubectl create -f ex.yaml
添加A记录解析(会发现多了一个别名)
外部访问hub.atguigu.com即可访问集群内部的pod服务。
Service Ingress(最常用)
原理及组成部分
Ingress可以理解为Service的Service。它由两部分组成
1.Ingress Controller
- 这是一个标准,可以有很多实现,其中
ingress-nginx
是最常用的 - 以pod形式运行的
2.Ingress策略设置
- 以yaml形式为载体的一组声明式的策略
ingress-controller
会动态地按照策略生成配置文件(如:nginx.conf
)
k8s 对外暴露服务(service)主要有两种方式:NotePort, LoadBalance, 此外externalIPs也可以使各类service对外提供服务,但是当集群服务很多的时候,NodePort方式最大的缺点是会占用很多集群机器的端口;LB方式最大的缺点则是每个service一个LB又有点浪费和麻烦,并且需要k8s之外的支持; 而ingress则只需要一个NodePort或者一个LB就可以满足所有service对外服务的需求。工作机制大致可以用下图表示:
实际上,Ingress相当于一个7层的负载均衡器,是k8s对反向代理的一个抽象。大概的工作原理也确实类似于Nginx,可以理解成在 Ingress 里建立一个个映射规则 , ingress Controller 通过监听 Ingress这个api对象里的配置规则并转化成 Nginx 的配置(kubernetes声明式API和控制循环) , 然后对外部提供服务。

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/aws/deploy-tls-termination.yaml kubectl apply -f deploy-tls-termination.yaml
部署后包括deployment,svc等都需要创建完成
或者直接访问官网查看部署方式
查看创建后暴露的服务地址
kubectl get svc -n ingress-nginx
如果想要访问80端口,就对应31345端口;如果想访问443端口,对应的就是31802端口
实验一:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-dm spec: replicas: 2 template: metadata: labels: name: nginx spec: containers: - name: nginx image: wangyanglinux/myapp:v1 imagePullPolicy: IfNotPresent ports: - containerPort: 80
apiVersion: v1 kind: Service metadata: name: nginx-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: name: nginx #当name=nginx时匹配
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nginx-test spec: rules: - host: www1.atguigu.com #公网域名 http: paths: - path: / backend: serviceName: nginx-svc #svc名 servicePort: 80
#可以看出,这个ingress连接的是svc的名称。
然后就可以通过ingress的域名从外网访问了,注意:访问的端口是上面ingress的端口:31345
实验二:
根据不同域名实现虚拟主机访问
实验拓扑图:
$ mkdir ingress-vh $ cd ingress-vh
创建第一个deployment和svc
$ vim deployment1.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: deployment1 spec: replicas: 2 template: metadata: labels: name: nginx1 spec: containers: - name: nginx1 image: wangyanglinux/myapp:v1 imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: svc-1 spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: name: nginx1 #当name=nginx1时匹配
$ kubectl apply -f deployment1.yaml
测试创建的svc能否访问
创建第二个deployment和svc
$ vim deployment2.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: deployment2 spec: replicas: 2 template: metadata: labels: name: nginx2 spec: containers: - name: nginx2 image: wangyanglinux/myapp:v2 imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: svc-2 spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: name: nginx2 #当name=nginx2时匹配 $ kubectl apply -f deployment2.yaml
测试svc访问
创建ingress
$ vim ingress-rule.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress1 spec: rules: - host: www1.atguigu.com http: paths: - path: / backend: serviceName: svc-1 #匹配的svc名 servicePort: 80 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress2 spec: rules: - host: www2.atguigu.com http: paths: - path: / backend: serviceName: svc-2 #匹配的svc名 servicePort: 80
$ kubectl apply -f ingress-rule.yaml
然后就可以通过两个不同的域名访问不同的资源了
可以进入容器查看ingress生成的nginx配置文件
kubectl exec pod名称 -n 名称空间 -- /bin/bash
cat nginx.conf
可以看到自动生成的对应域名的配置及反向代理(上面写的ingress规则,会将其转换成nginx的配置文件)
访问测试
查看ingress暴露的端口
网页端访问
查看当前ingress规则
kubectl get ingress
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
# tls.crt:公钥 tls.key:私钥 公共密钥证书必须是.PEM编码并匹配指定的私钥
$ vim deployment3.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: deployment3 spec: replicas: 2 template: metadata: labels: name: nginx3 spec: containers: - name: nginx3 image: wangyanglinux/myapp:v3 imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: svc-3 spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: name: nginx3 #当name=nginx3时匹配 $ kubectl apply -f deployment3.yaml
查看并测试创建结果:
$ vim https_ingress.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: https spec: tls: - hosts: - www3.atguigu.com secretName: tls-secret #上面创建时保存的证书名称 rules: - host: www3.atguigu.com http: paths: - path: / backend: serviceName: svc-3 servicePort: 80
$ kubectl apply -f https_ingress.yaml
查看当前ingress访问端口
连接测试
yum -y install httpd mkdir basic-auth cd basic-auth/ htpasswd -c auth foo #创建秘钥文件为auth,用户名为foo kubectl create secret generic basic-auth --from-file=auth
创建ingress
$ vim ingress.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-with-auth annotations: nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo' #说明 spec: rules: - host: auth.atguigu.com #绑定域名 http: paths: - path: / backend: serviceName: svc-1 #链接的svc servicePort: 80
$ kubectl apply -f ingress.yaml
访问测试

$ vim re.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nginx-test annotations: nginx.ingress.kubernetes.io/rewrite-target: https://www3.atguigu.com:31802 #跳转地址 spec: rules: - host: re.atguigu.com #访问地址 http: paths: - path: / backend: serviceName: svc-1 #这个可以随便链接都行,甚至不链接也可以,因为它没有一个真实主机的存在 ,访问时就会跳转到另一个主机上了 servicePort: 80
$ kubectl apply -f re.yaml
访问测试:(可以看到请求re.atguigu.com时跳转到www3.atguigu.com)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了