本地安装kubectl、skaffold环境

1、配置exe可执行文件

  • 下载文件(需要梯子)
    skaffold
    kubectl
    minikube
  • 配置环境变量
    将上面下载好的文件,改名为skaffold.exe、kubectl.exe、minikube.exe;
    将改好名字的文件放到任意目录下(建议在当前计算机用户目录下创建一个文件夹存放),并配置环境变量

2、配置kubectl环境

  • 在当前计算机登录用户目录下创建一个 .kube 文件夹,将config文件放到里面

    注意:
    config文件在k8s master节点所在服务器的根目录.kube目录下,下载下来放到windows环境下即可
  • 测试是否可以通讯
    • 可能报错:
      Unable to connect to the server: x509: certificate is valid for k8s-master, kubernetes, kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster.local, not apiserver.baser.cloud
    • 报错原因:
      kubernetes的apiserver-advertise-address是一个内网IP,默认情况下,kubernetes自建的CA会为apiserver签发一个证书,证书的默认可访问的是内网IP、kubernetes、kubernetes.default kubernetes.default.svc、kubernetes.default.svc.cluster.local,不包含设备的外网IP。所以直接通过admin.conf去访问kubernetes是不可能的。
    • 解决方案:
      1、删除当前kubernetes集群下的apiserver的cert和key
      rm /etc/kubernetes/pki/apiserver.*
      
      2、生成新的apiserver的cert和key
      kubeadm init phase certs apiserver –apiserver-advertise-address=0.0.0.0 –apiserver-cert-extra-sans=apiserver.baser.cloud
      
      3、刷新admin.conf
      kubeadm alpha certs renew admin.conf
      
      4、重启apiserver(可以先delete在apply)
      kubectl delete pod ${你的apiserver的pod} –n kube-system
      kubectl delete –f /etc/kubernetes/manifests/kube-apiserver.yaml
      kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
      
      5、在另一台装有kubernetes客户端的设备中,使用新生成的admin.conf访问集群
      kubectl get nodes
      
      6、然后执行
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      kubectl get nodes
      

3、配置skaffold环境

  • 先创建kubernetes清单文件(Deployment.yml、Service.yml)
    • 如果不先创建k8s的配置清单文件就初始化skaffold会报错:
      one or more valid Kubernetes manifests are required to run skaffold
    • 创建Deployment.yml:
      语法:kubectl create deployment my-dep --image=busybox
      官方文档
      kubectl create deployment see-dev --image=registry.cn-beijing.aliyuncs.com/see_obj/see_dev_1 --dry-run -oyaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        creationTimestamp: null
        labels:
          app: see-dev
        name: see-dev
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: see-dev
        strategy: {}
        template:
          metadata:
            creationTimestamp: null
            labels:
              app: see-dev
          spec:
            containers:
            - image: registry.cn-beijing.aliyuncs.com/see_obj/see_dev_1
              name: see-dev-1-l6jxw
              resources: {}
      status: {}     
      
    • 创建Service.yml:
      官方文档
      kubectl expose deployment see-dev --type=NodePort --port=8080 --dry-run=client -oyaml
      apiVersion: v1
      kind: Service
      metadata:
        creationTimestamp: null
        labels:
          app: see-dev
        name: see-dev
      spec:
        # 端口
        ports:
          # Service在集群内部暴露的端口
          - port: 8080
            protocol: TCP
            # 内部端口映射到Pod暴露出的端口
            targetPort: 8080
        # 选择器
        selector:
          # 指定label中app=myName的Pod都归属于当前Service
          app: see-dev
        # Service类型,NodePort类型可以对外暴露。
        # 不指定的话,则默认为ClusterIP,只能集群内部访问
        type: NodePort
      status:
        loadBalancer: {}
      
      参考:https://dzone.com/articles/skaffolding-springboot-application
  • 初始化skaffold
    在项目根目录执行:
    skaffold init
    可能会提示报错:
    one or more valid builder configuration (Dockerfile or Jib configuration) must be present to build images with skaffold; please provide at least one build config and try again or run skaffold init --skip-build
    【译】skaffold正在项目中寻找Dockerfile或Jib配置,我们的项目里可能没有书写dockerfile或者Jib配置
    skaffold当前支持以下构建器:
    Docker
    Jib(with --XXenableJibInit flag)
    Buildpacks (with --XXenableBuildpacksInit flag)
    解决:
    没有Dockerfile和Jib配置 使用Jib插件解决
    在pom.xml引入(常用配置详解)
    <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-resources-plugin</artifactId>
               <version>3.2.0</version>
           </plugin>
           <plugin>
               <groupId>com.google.cloud.tools</groupId>
               <artifactId>jib-maven-plugin</artifactId>
               <version>2.7.0</version>
               <configuration>
                   <from>
                       <image>java:8</image>
                   </from>
                   <!-- 最后生成的镜像配置 -->
                   <to>
                       <image>registry.cn-beijing.aliyuncs.com/mars-dev/mars-boot:${project.version}</image>
                       <auth>
                           <username>username</username>
                           <password>password</password>
                       </auth>
                   </to>
                   <container>
                       <mainClass>cloud.baser.mars.MarsBootApplication</mainClass>
                   </container>
                   <allowInsecureRegistries>true</allowInsecureRegistries>
               </configuration>
           </plugin>
       </plugins>
    
    启用Jib支持
    根据官方文件:
    skaffold init 还可以识别Maven和Gradle项目,并将自动建议jib建造者。当前,jib工件检测默认情况下处于禁用状态,但可以使用该标志启用。--XXenableJibInit。
  • 继续初始化skaffold流程文件
    执行skaffold init --XXenableJibInit
    skaffold init --XXenableJibInit
    
    apiVersion: skaffold/v2beta5
    kind: Config
    metadata:
      name: devtest
    build:
      artifacts:
      - image: registry.cn-beijing.aliyuncs.com/see_obj/see_dev_1
        jib:
          project: cloud.genitus:jenkins_test_dev
    deploy:
      kubectl:
        manifests:
        - k8s/mydeployment.yml
        - k8s/myservice.yml
    
    Do you want to write this configuration to skaffold.yaml? [y/n]: y
    Configuration skaffold.yaml was written
    You can now run [skaffold build] to build the artifacts
    or [skaffold run] to build and deploy
    or [skaffold dev] to enter development mode, with auto-redeploy
    
    在项目根目录会创建一个skaffold.yaml文件
    然后使用skaffold dev命令测试部署
    可能会报错:spec.template.spec.containers[0].name: Invalid value: “uqdm_base”
    解决方法:
    原因为容器中镜像名称不支持下划线
    DNS-1123标签必须由小写字母数字字符或’ - ‘组成,必须以字母数字字符开头和结尾(例如’ my-name’或’123-abc’,用于验证的正则表达式是’[a-z0-9]([ - a-z0-9] * [a-z0-9])’’)改为中划线即可成功创建
posted @ 2023-05-17 18:00  嘸杺  阅读(319)  评论(0编辑  收藏  举报