zoukankan      html  css  js  c++  java
  • k8s之Service资源

    Service资源为动态管理的Pod对象添加一个固定访问入口
    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       <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]# 
    

    svc类型:
    clusterIP:为一个svc分配一个当前集群内的动态地址,客户端pod对象访问服务的Pod对象时不会进行源地址转换,且不会被外部地址访问,只能在集群内部被访问。
    NodePort:对于某svc来说会在每个节点生成一个ipvs规则打开节点端口,映射至svc ip的端口上。

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

    kubectl edit cm kube-proxy -n kube-system
    image.png
    在线修改configmap文件,使其加载ipvs规则
    kubectl delete pod -l k8s-app=kube-proxy,pod-template-generation=1 -n kube-system ##删除pod,让ipvs规则在kube-proxy生效
    image.png
    生效之后的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
    image.png
    image.png

    创建后端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端口
    ~                        
    

    image.png
    创建成功,会自动关联至myapp此svc,且会绑定后端资源
    image.png
    此时直接访问宿主机即可访问后端资源

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

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

    image.png
    image.png

  • 相关阅读:
    Android 查看通讯录Contacts是否发生变化
    卓尼斯ZT-180评測
    C++中的单例模式
    Android 动画之ScaleAnimation应用具体解释
    java的静态代理
    词性标注
    ubuntu 11.04安装笔记
    机房收费系统学生下机结账小结
    MyBatis入门学习(一)
    !!!!OpenWrt系列教程汇总
  • 原文地址:https://www.cnblogs.com/woaiyitiaochai/p/12023159.html
Copyright © 2011-2022 走看看