5.1 介绍服务

  1. 前提条件

    0.0 环境准备
    0.1 安装docker
    0.2 安装k8s

  2. 系统管理员无法在用户端配置文件中明确指出服务的精确IP地址或者主机名来配置每个客户端应用
    1. pod是短暂的
    2. k8s在pod启动前会给已经调度到节点上的pod分配IP地址(客户端无法提前知道提供服务的pod的IP地址)
    3. 水平伸缩意味着多个pod可能会提供相同的服务
  3. 创建服务(服务有固定的ip和域名)
    1. 使用标签选择器来指定哪些pod属于服务
    2. 定义kubia-rs-svc.yaml
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: kubia-rs-svc
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: kubia
      template:
        metadata:
          labels:
            app: kubia
        spec:
          containers:
          - name: kubia
            image: nuptaxin/kubia
    
    1. 创建rs:
      kubectl create -f kubia-rs-svc.yaml
    2. 定义kubia-svc.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: kubia-svc
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: kubia
    
    1. 创建服务
      kubectl create -f kubia-svc.yaml
    2. 查询服务
      kubectl get svc
  4. 从内部集群测试服务
    1. 在运行的容器中远程执行命令
      1. 创建用于测试的pod:kubia-svc-test.yaml
      apiVersion: v1
      kind: Pod
      metadata:
        name: kubia-svc-test-pod
        labels:
         usage: svc-test
      spec:
        containers:
        - image: nuptaxin/kubia
          name: kubia-yaml
          ports:
          - containerPort: 8080
            protocol: TCP
      
      1. 创建pod
        kubectl create -f kubia-svc-test.yaml
      2. 使用服务的ip访问服务(kubectl get svc获取ip,若此时获取到的clusterIp为:10.104.182.173)【双横杆代表着kubectl命令项的结束,之后的内容是指在pod内部需要执行的命令。如果后面的指令没有以横杠开始的参数,双横杠也不是必须的。此处为-s,即简化为kubectl exec kubia-svc-test-pod curl http://10.110.101.216也是可以正常执行】(随机命中一个pod)
        kubectl exec kubia-svc-test-pod -- curl -s http://10.104.182.173
  5. 配置服务上的会话的亲和性(默认调用不同pod,可以配置每次请求指向同一个pod:sessionAffinity)【亲和性只支持None和ClientIP】
    1. 定义kubia-svc-affinity.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: kubia-svc-affinity
    spec:
      sessionAffinity: ClientIP
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: kubia
    
    1. 创建服务
      kubectl create -f kubia-svc-affinity.yaml
    2. 查询服务
      kubectl get svc
    3. 根据上述svc ip(若获取的ClusterIP:10.99.97.52)请求(每次都命中同一个pod)
      kubectl exec kubia-svc-test-pod -- curl -s http://10.99.97.52
  6. 同一个服务暴露多个端口
    1. 根据官方文档,创建https端口根证书,在Dockerfile目录下
      openssl genrsa -out key.pem
      openssl req -new -key key.pem -out csr.pem
      openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem
      rm csr.pem
    2. 创建支持多端口的app.js文件
    const http = require('http');
    const os = require('os');
    const https = require('https');
    const fs = require('fs');
    
    console.log("Kubia server starting...");
    
    var handler = function(request, response) {
        console.log("Received request from " + request.connection.remoteAddress);
        response.writeHead(200);
        response.end("You've hit " + os.hostname() + "\n");
    };
    
    var www = http.createServer(handler);
    www.listen(8080);
    
    const options = {
        key: fs.readFileSync('key.pem'),
        cert: fs.readFileSync('cert.pem')
    };
    https.createServer(options, handler).listen(443);
    
    1. 为镜像创建Dockerfile(创建一个叫Dockerfile的文件,它包含了一系列构建镜像时会执行的指令,Dockerfile文件需要和app.js文件在同一目录)
    FROM node:7
    ADD app.js /app.js
    ADD key.pem /key.pem
    ADD cert.pem /cert.pem
    ENTRYPOINT ["node", "app.js"]
    
    1. 构建容器镜像(每一行Dockerfile指令都会产生一个新层,也可以通过运行已有镜像容器手动构建镜像,优点是Dockerfile是自动化且可重复的)
      docker build -t kubia-https .
    2. 使用附加标签标注镜像(由于Minikube中使用的本地images和docker自带的本地images不同,故需要打包后上传)
      docker tag kubia-https nuptaxin/kubia-https
    3. 向Docker Hub推送镜像
      docker push nuptaxin/kubia-https
    4. 定义kubia-rs-https.yaml
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: kubia-rs-https
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: kubia-https
      template:
        metadata:
          labels:
            app: kubia-https
        spec:
          containers:
          - name: kubia-https
            image: nuptaxin/kubia-https
    
    1. 创建rs:
      kubectl create -f kubia-rs-https.yaml
    2. 查询pod
      kubectl get po
    3. 测试访问
      1. 浏览器访问http://8.130.177.188:8080
        kubectl port-forward rs/kubia-rs-https 8080:8080 --address 0.0.0.0
      2. 浏览器访问https://8.130.177.188:8080。如果出现证书信任问题,在谷歌浏览器页面上盲打thisisunsafe即可绕过信任问题
        kubectl port-forward rs/kubia-rs-https 8080:443 --address 0.0.0.0
    4. 定义kubia-svc-multi-port.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: kubia-svc-multi-port
    spec:
      ports:
      - name: http
        port: 80
        targetPort: 8080
      - name: https
        port: 8443
        targetPort: 443
      selector:
        app: kubia-https
    
    1. 创建服务
      kubectl create -f kubia-svc-multi-port.yaml
    2. 查询服务
      kubectl get svc
    3. 根据上述svc ip(若ip为:10.96.214.45)请求(pod中直接请求https需要忽略证书)
      kubectl exec kubia-svc-test-pod -- curl -s http://10.96.214.45:80
      kubectl exec kubia-svc-test-pod -- curl -k --tlsv1 -s https://10.96.214.45:8443
    4. 注:标签选择器应用于整个服务,不能对每个端口做单独的配置。如果不同的pod有不同的端口映射关系,需要创建两个服务
  7. 使用命名的端口【好处:即使换端口号也无须更改服务描述】
    1. 定义kubia-rs-port-name.yaml
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: kubia-rs-port-name
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: kubia-rs-port-name
      template:
        metadata:
          labels:
            app: kubia-rs-port-name
        spec:
          containers:
          - name: kubia
            image: nuptaxin/kubia
            ports:
            - name: http
              containerPort: 8080
    
    1. 创建rs:
      kubectl create -f kubia-rs-port-name.yaml
    2. 定义kubia-svc-port-name.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: kubia-svc-port-name
    spec:
      ports:
      - name: http
        port: 80
        targetPort: http
      selector:
        app: kubia-rs-port-name
    
    1. 创建服务
      kubectl create -f kubia-svc-port-name.yaml
    2. 查询服务
      kubectl get svc
    3. 根据上述svc ip(若IP为:10.104.147.118)请求
      kubectl exec kubia-svc-test-pod -- curl -s http://10.104.147.118
  8. 服务发现
    1. 通过环境变量发现服务【条件:服务早于客户端pod的创建】
      1. 删除并重建pod:kubia-svc-test-pod
        kubectl delete po kubia-svc-test-pod
        kubectl create -f kubia-svc-test.yaml
      2. 查询pod内的环境变量:
        kubectl exec kubia-svc-test-pod env
      3. 查询结果中服务的ip和端口会在此展示(服务名会转换为大写,且服务名称中的横杠转为下划线):
        KUBIA_SVC_AFFINITY_SERVICE_PORT=80 KUBIA_SVC_AFFINITY_SERVICE_HOST=10.99.78.57
    2. 通过DNS发现服务(通过FQDN连接服务)
      1. 连接服务:svc-name.default.svc.cluster.local
        1. svc-name 对应服务名称
        2. default表示命名空间
        3. svc.cluster.local是在所有集群本地服务名称中使用的可配置集群域后缀
        4. 【如果在同一命名空间下,可以省略svc.cluster.local后缀,甚至命名空间】
      2. 尝试使用FQDN连接服务
        1. 查询服务
          kubectl get svc
        2. 根据上述svc ip请求
          kubectl exec kubia-svc-test-pod -- curl -s http://kubia-svc-port-name
  9. 在pod容器中运行shell
    1. kubectl exec -it kubia-svc-test-pod bash
    2. curl http://kubia-svc-port-name
    3. curl -k --tlsv1 https://kubia-svc-multi-port:8443
    4. 集群域后缀和命名空间可以缩写的原因:
      cat /etc/resolv.conf
    5. 无法ping通服务IP的原因【容器内执行】【原因:服务的IP是一个虚拟IP,只有与服务端口结合时才有意义】
      ping kubia-svc-port-name
    6. 退出容器
      exit
  10. 资源清理
    kubectl delete rs kubia-rs-svc
    kubectl delete rs kubia-rs-https
    kubectl delete rs kubia-rs-port-name
    kubectl delete po kubia-svc-test-pod
    kubectl delete svc kubia-svc
    kubectl delete svc kubia-svc-affinity
    kubectl delete svc kubia-svc-multi-port
    kubectl delete svc kubia-svc-port-name
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值