本地安装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
2、生成新的apiserver的cert和keyrm /etc/kubernetes/pki/apiserver.*
3、刷新admin.confkubeadm init phase certs apiserver –apiserver-advertise-address=0.0.0.0 –apiserver-cert-extra-sans=apiserver.baser.cloud
4、重启apiserver(可以先delete在apply)kubeadm alpha certs renew admin.conf
5、在另一台装有kubernetes客户端的设备中,使用新生成的admin.conf访问集群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
6、然后执行kubectl get nodes
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:
官方文档
参考:https://dzone.com/articles/skaffolding-springboot-applicationkubectl 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: {}
- 如果不先创建k8s的配置清单文件就初始化skaffold会报错:
- 初始化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引入(常用配置详解)
启用Jib支持<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>
根据官方文件:
skaffold init 还可以识别Maven和Gradle项目,并将自动建议jib建造者。当前,jib工件检测默认情况下处于禁用状态,但可以使用该标志启用。--XXenableJibInit。 - 继续初始化skaffold流程文件
执行skaffold init --XXenableJibInit
在项目根目录会创建一个skaffold.yaml文件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 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])’’)改为中划线即可成功创建