首页 网维知识库 k8s之Service资源

k8s之Service资源

Service资源是为动态管理的Pod对象添加一个固定访问入口。 Service为四层调度器 service通过标签选择器关联至拥有相关标签的Pod对象 客户端向Service进行…

Service资源是为动态管理的Pod对象添加一个固定访问入口。

k8s之Service资源插图

Service为四层调度器

service通过标签选择器关联至拥有相关标签的Pod对象

客户端向Service进行请求,而非目标Pod对象,当Service资源变动时,有kube-proxy控制器将规则应用至本机iptables或者ipvs规则。

而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完成

servcie资源定义:

[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               443/TCP        2d5h
myweb        NodePort    10.100.112.31           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           80/TCP    2m2s
[root@node1 chapter5]# curl 10.105.226.215
Hello MyApp | Version: v2 | Pod Name
[root@node1 chapter5]# 

svc类型

clusterIP:为一个svc分配一个当前集群内的动态地址,客户端pod对象访问服务的Pod对象时不会进行源地址转换,且不会被外部地址访问,只能在集群内部被访问。

NodePort:对于某svc来说会在每个节点生成一个ipvs规则打开节点端口,映射至svc ip的端口上。

还可以手动创建endpoints资源将ip地址指向外部。将名称命名为svc相同时即可

kubectl edit cm kube-proxy -n kube-system

k8s之Service资源插图1

在线修改configmap文件,使其加载ipvs规则

kubectl delete pod -l k8s-app=kube-proxy,pod-template-generation=1 -n kube-system ##删除pod,让ipvs规则在kube-proxy生效

k8s之Service资源插图2

生效之后的pod会生成ipvs规则。

Ingress资源,7层代理|调度

标准的api对象,管理外部请求到内部流量。协议为http,仅用域定义流量转发和调度的通用格式的配置信息,它们需要转换为特定的具有http协议转发和调度功能的应用程序的配置文件,并由相应的应用程序生效,相应的配置后完成流量转发

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使其外部网络能够访问至ingress

k8s之Service资源插图3
k8s之Service资源插图4

创建后端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配置。

apiVersion: 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端口

k8s之Service资源插图5

创建成功,会自动关联至myapp此svc,且会绑定后端资源

k8s之Service资源插图6

此时直接访问宿主机即可访问后端资源

使用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

k8s之Service资源插图7

创建完成

kubectl exec -it nginx-ingress-controller-568867bf56-lrm4f -n ingress-nginx -- /bin/sh##连接至pod内容器,配置文件会自动填充我们定义的ingress的配置

k8s之Service资源插图8
k8s之Service资源插图9
k8s之Service资源插图10

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。

作者: 3182235786a

为您推荐

windows8

windows8

Windows 8 是微软公司于 2012 年推出的一款操作系统,因其独特的界面设计和功能受到广泛关注。本文将从 Win...
Windows 下载指南:获取最新版本的 Windows 操作系统

Windows 下载指南:获取最新版本的 Windows 操作系统

作为全球最受欢迎的操作系统之一,Windows 提供了丰富的功能和用户友好的界面。如果您想获取最新版本的 Windows...
windows资源管理器已停止工作

windows资源管理器已停止工作

Windows 资源管理器已停止工作是 Windows 操作系统中常见的一个问题,通常表现为资源管理器窗口无法正常打开或...
Windows 10 激活方法详解:轻松激活您的操作系统

Windows 10 激活方法详解:轻松激活您的操作系统

购买了全新的Windows 10操作系统后,如何激活它成为许多用户关注的问题。本文将为您详细介绍Windows 10的激...
windows10激活工具

windows10激活工具

Windows 10 激活工具是一款用于激活 Windows 10 操作系统的软件。通过使用激活工具,用户可以轻松地激活...

发表回复

返回顶部