zoukankan      html  css  js  c++  java
  • .NetCore 使用k8s部署服务的过程中需要注意的地方以及遇到的问题

    这里开始我准备了3台测试服务器,这里我使用了JumpServer管理起来了,这里我们来看下:

    Master :192.168.0.236

    Node1:192.168.0.237

    Node2:192.168.0.238

    这里k8s搭建的过程就略了,同时我们需要一个镜像仓库,这里安装Harbor,安装过程略

    问题1:如何通过K8S 拉去我Harbor镜像仓库上的私有镜像?

    首先我们创建我们的k8s资源,这里提供了三种方式:

    从文本输入框创建、从文件创建、直接创建应用,要实现这一步需要去了解k8s yaml相关语法规则以及配置详细,这里我贴下一个测试案例,这个配置是拷贝出来的,自己创建也不了这么多,这里需要特别了解就是

    资源对象:Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob、HorizontalPodAutoscaling

    配置对象:Node、Namespace、Service、Secret、ConfigMap、Ingress、Label、ThirdPartyResource、 ServiceAccount

    存储对象:Volume、Persistent Volume

    策略对象:SecurityContext、ResourceQuota、LimitRange

    这里创建一个Deployment为例子,这里就需要注意了,怎么来配置拉去镜像呢?

    #创建 deployment       这是我们要部署的项目
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: examimage-test             # 部署项目的名称,必选
      namespace: uoso-system          # 项目部署在什么命名空间下
      labels:
        app: k8s-examimage               # 标签,可以随意定义,这个标签在项目部署完成后还可以继续修改
    spec:
      replicas: 2                     # 生成副本数量为2
      selector:
        matchLabels:
          app: k8s-examimage
      template:
        metadata:
          labels:
            app: k8s-examimage
          annotations:
            app: examimage-clouster
        spec:
          containers:
          - name: examimage
            image: 私用仓库地址/stu-exam/examimage:pro-1.0      # 镜像的名字
            volumeMounts:
              - name: examimage-web                             # 卷名,随意定义
                mountPath: /appexam/appsettings.json              # 容器内的目录
                readOnly: true                               # 只读
          volumes:
          - name: examimage-web                                 # 卷名,与上面一样
            hostPath:                                        # 宿主机目录,这里可以选择网络存储等,下面注释的地方是网络存储
            # nfs
              # server: ip地址
              path: /opt/testuoso/appsettings.json  # 挂载文件(文件夹)结束
            imagePullPolicy: IfNotPresent                    # 这里有三个值,这里的值表示的意思是"当镜像不存在时就去仓库拉取,存在时就直接使用"
          imagePullSecrets:
          - name: liyouming                      # 这里是当拉去镜像时的密码字典,这个要先定义好才能使用
            resources:
              limits:
                cpu: 300m
                memory: 3000Mi
              requests:
                cpu: 100m
                memory: 100Mi
            ports:
            - containerPort: 80                            # 这里的端口就是该镜像暴露的端口,即Dockerfile文件里面EXPOSE的端口

     配置中添加了imagePullSecrets配置指定了保密字典配置名称,那么我们怎么配置 registrysecret-uoso11账户的保密字典呢?

    这里可能发现k8s并不像功能模块一样,一个模块都有对应的添加,都是通过创建而来的,需要自定kind类型,前面也列举了 对象类型了,创建保密字典我们需要创建Secret类型

    这里我找一个看一下

     其中有些是系统生成的,我们实际创建的时候不需要这么多,我这边整理下,这里需要注意的data 和type,type 共有三种方式对应不同的写法,下面这个我们来创建下

    kubernetes.io/dockerconfigjson 这个类型的,其他类型:kubernetes.io/service-account-token、Opaque

    {
      "kind": "Secret",
      "apiVersion": "v1",
      "metadata": {
        "name": "liyouming",
        "namespace": "uoso-system"   
      },
      "data": {
        ".dockerconfigjson": "base64编码的一个字符串docker密钥" #这里又格式校验的
      },
      "type": "kubernetes.io/dockerconfigjson"
    }

    dockerconfigjson 配置的内容怎么获取呢?

    就用master上的docker 远程登录下镜像仓库会生成:/root/.docker/config.json的文件,接下来我们来看下里面的内容,我们登录docker harbor的账户授权都在这里了,我这个多了几个

     这里我退出几个就可以看到只剩下我远程仓库中的

     下面我们将 这个base64加密下,加加密后的编码拷贝到.dockerconfigjson配置里面

     

     之前创建的 liyouming 就创建成功了,现在我们来拉去镜像,接下来创建我们的部署,拷贝好之前写好的yaml文件创建

     可以看到成功了 2个容器均应分布在了2个节点上,现在伸缩下 到6个,速度也是超快

     

    到这里其实我们还是不能访问的,还需要添加服务

    apiVersion: v1
    kind: Service
    metadata:
      name: k8s-examimage                 # 定义该服务的名称,可随意填写,但是最好是有意义的名字
      namespace: uoso-system           # 这里是指定该服务运行在什么命名空间下,如果不要这行的话,那么该服务会运行在default命名空间下,在k8s里面,不同命名空间下的所有应用都都是隔开的
      labels:                          # 设置该服务的标签
        app: k8s-examimage               
    spec:                             
      type: NodePort                   # 端口映射的方式
      ports:
      - port: 80                     # 端口
        targetPort: 80               # 分配Expose端口
        nodePort: 80                 # 外部端口
        protocol: TCP
    #  clusterIP: 169.169.249.80     # 分配集群ip
      selector:
       app: k8s-examimage

    创建服务后可以看到如下图:

     现在看下我们之前的服务能不能访问,我们分别访问下 192.168.0.236、192.168.0.237、192.168.0.238,这里可以看到服务端口80

    192.168.0.236 访问正常

     

    192.168.0.237 访问正常

    192.168.0.238 访问也正常

    其实这里还有一个问题的就是挂载资料卷的问题?

    前面yaml中写到的都是挂载到本机上的,但是多个节点不可能能每个节点都去写对应的路径配置文件,这是不科学的.

    对于现有的采取措施,我自己的服务简单的系统内部配置文件,打包的时候就直接打到容器内部不做修改,统一采用远程配置中心(apollo)来出来配置修改

    如果不需要热更,其实打包到容器内部就ok了,其次如果有需要可以采用NFS来做文件处理或者使用 K8S字段配置表来完成最好

  • 相关阅读:
    2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 C: Coconut
    2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 A: Banana
    第2周项目1c++语言中函数参数传递的三种方式
    第2周项目2程序的多文件组织
    【BZOJ 3224】普通平衡树
    【POJ 1741】Tree
    浅谈树分治
    【luogu 2709 / BZOJ 3781】小B的询问
    【luogu 1972 / BZOJ 1878】HH的项链
    【BZOJ 3339 / BZOJ 3585 / luogu 4137】Rmq Problem / mex
  • 原文地址:https://www.cnblogs.com/liyouming/p/11738542.html
Copyright © 2011-2022 走看看