再次白嫖 ,30分钟搭建自己的 DevOps + K8S 集群

👈👈👈 欢迎点赞收藏关注哟

首先分享之前的所有文章 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164...
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca...

一. 前言

之前用阿里云零成本搭建了一个DevOps 方案,这一篇来继续进行扩展。

核心重点 :

  • 书接上文 DevOps + Docker 的部署
  • Docker 私服的部署 K8S 拉取 Docker 私服镜像流程
  • 起因 : 单纯的 Docker 部署实现集群困难,无法做更复杂的处理
  • 本篇目标 : 实现 K8S 集群的部署,同时部署多个应用
  • 基于的技术 : Minikube + 云效 + Docker + K8S

云效发布确实让我们把应用发布为 Docker 的方式部署在服务器上面,但是 缺少了自动编排的过程让服务远达不到持续部署的效果(PS : 我要搭建一个秒杀的微服务集群) ,这个时候就需要搭配 Kubernetes 进行使用了。

主要是为了验证集群的配置,所以集群的创建会以工具直接实现,这里使用的是 Minikube只验证单机集群,后续再研究多物理机集群,循序渐进嘛

二. Minikube 安装

java 复制代码
// S1 : 下载 MiniKube 应用
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 
chmod +x minikube-linux-amd64 
sudo mv minikube-linux-amd64 /usr/local/bin/minikube


// S2 : 启动 MiniKube
minikube start --force --image-mirror-country='cn' --driver='none' --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --registry-mirror=https://reg-mirror.qiniu.com --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.30.2.iso --kubernetes-version=v1.23.8

// 参数 :
--driver=docker : 
    - 在本地使用 Docker 来运行 Kubernetes 集群 
    - 意味着 `minikube` 本身也会运行在 Docker 容器中
--driver=none :
    - 在本地机器上运行 Kubernetes 集群


// S3 : 查看安装情况
- 查看版本 :minikube version
- 查看且安装 kubectl : minikube kubectl version



// 补偿操作 :
- 停止 minikube : minikube stop
- 删除 minikube : minikube delete


// S4 : 转换 kubectl 命令 (否则需要一直添加 minikube 前缀)
- 首先查询命令的位置 : find / -name kubectl
- 迁移命令到 bin 目录 : cp /var/lib/docker/volumes/minikube/_data/lib/minikube/binaries/v1.23.8/kubectl /bin/
- kubectl version


// S5 : 通过 Kubectl 配置 minikube 集群
kubectl config use-context minikube


// S6 : 查询集群配置情况
kubectl cluster-info

添加控制台

java 复制代码
//  打开控制台
minikube dashboard

// 启用插件
minikube addons enable dashboard

// 方式一 : 设置外部访问代理
kubectl proxy --port=8066 --address=[服务器IP] --accept-hosts='^.*' &
// 接收所有的服务端请求
kubectl proxy --address='0.0.0.0' --accept-hosts='^*$' --port=8009

// 方式二 : 通过 NodePort
kubectl expose deployment kubernetes-dashboard --type=NodePort --port=80 --target-port=9090 -n kubernetes-dashboard

其他命令

java 复制代码
// 查询插件列表
minikube addons list

三. 手动尝试创建一个应用

java 复制代码
// S1 : 创建一个 Nginx 
kubectl create deploy nginx-pod --image=nginx --port=80

// S2 : 查看 pods 执行情况
kubectl get pods -o wide
kubectl get pods -A |grep name

// S3 : 为 Pods 暴露一个端口
kubectl expose deploy nginx-pod --type=NodePort
kubectl expose deploy nginx-pod --type=NodePort --port=8085 --target-port=80

--port:Service 暴露的端口,即 Service 暴露给外部的端口
--target-port :Server 内部应用的端口

// S4 : 查看所有的服务
kubectl get svc

// S5 : 查询服务日志
kubectl logs nginx-pod-b8995ffbb-xc8z4   

- 查看 deployment : kubectl get deployments  -A |grep nginx
- 删除 deploy :  kubectl delete deployments nginx-pod
- 删除 pods : kubectl delete pod nginx-pod-b8995ffbb-xc8z4
- 删除服务 : kubectl delete service nginx-pod

至此 ,我们自己的 K8S 集群就搭建完成,成功运行了一个 Nginx 项目,下面要把我们的应用发布到集群里面去

虽然这里使用的是 MiniKube , 这个偏本地或者单机使用,但是核心还是用的 kubectl 和 Config ,这些都是通用的,后面是可以无损切换的。

四. DevOps 集成

这里基于云效的自定义容器集群方式 :

4.1 配置好 K8S 集群配置

java 复制代码
// S1 : 查询对应的 /.kube/config  文件
cat  ~/.kube/config
apiVersion: v1
--- 省略
users:
- name: minikube
  user:
    client-certificate: /root/.minikube/profiles/minikube/client.crt
    client-key: /root/.minikube/profiles/minikube/client.key
  
// 要点一 : 获取 crt 文件 的 BASE64 数据?
cat /root/.minikube/profiles/minikube/client.crt | base64 -w 0
cat /root/.minikube/profiles/minikube/client.key | base64 -w 0

// 要点二 : SSL 证书跳过
insecure-skip-tls-verify: true

// 要点三 : cluster.server 修改为集群主机域名

// S2 : 修改后的 cat config 文件
apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    extensions:
    - extension:
        last-update: Thu, 05 Oct 2023 20:55:58 CST
        provider: minikube.sigs.k8s.io
        version: v1.31.2
      name: cluster_info
    server: https://47.33.22.11:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Thu, 05 Oct 2023 20:55:58 CST
        provider: minikube.sigs.k8s.io
        version: v1.31.2
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate-data: LS0tLS1CRU......USUZJQ0FURS0tLS0tCg==
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJ......tLS0tLQo=

重点 :基于安全性,不可能随便把应用发布到K8S集群中,所以会有几个重要的配置 :

  • /.kube/config 文件是 K8S 创建完成后自动生成的 , 应该是集群创建的 S5 步
  • client.crt 和 client.key 也是集群创建时生成,但是需要转换成 Base64
  • client.crt 和 client.key 的路径是 /.kube/config 中找到的
  • client-certificate-data + client-key-data 是替换 client-certificateclient-key , 填入的是 Base64 后的 client.crt 和 client.key
  • 不用传入证书配置,用 insecure-skip-tls-verify 忽略

4.2 配置云效发布方式

前面和上一篇都是类似的,只看最后的 Kubernetes 发布部分: DevOps + Docker 的部署

java 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ${appName}
  labels:
    app: ${appName}
spec:
  replicas: ${pods}
  selector:
    matchLabels:
      app: ${appName}
  template:
    metadata:
      labels:
        app: ${appName}
    spec:
      containers:
        - name: ${imageName}
          image: ${commitId}
          imagePullPolicy: Always
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          env:
            - name: JAR_NAME
              value: ${jarName}
      imagePullSecrets:
        - name: regcred

${jarName} 都是我的变量 ,项目的结构如下 :

java 复制代码
// start.sh
exec java -jar quick.jar ""

4.3 访问结果

全部启动完成,访问也没有什么问题

java 复制代码
// 配置访问端口
kubectl get deployments  -A |grep quick

// 配置外部访问地址
kubectl expose deploy quick --type=NodePort --port=8012 --target-port=8080
kubectl get svc

总结

遗留下来的问题 :

  • 多物理机部署
  • 不算很白嫖,需要一个物理机部署K8S集群
  • IP 配置,网络连接,交互访问还待完善

以上这些问题应该会在这个月处理掉,欢迎关注。

附录 :部署问题

未安装 Docker

java 复制代码
* Unable to pick a default driver. Here is what was considered, in preference order:
* Alternatively you could install one of these drivers:
  - docker: Not installed: exec: "docker": executable file not found in $PATH


解决方案 : https://juejin.cn/post/7231539287459872827#heading-3

权限问题

java 复制代码
The "docker" driver should not be used with root privileges. If you wish to continue as root, use --force.

原因 :不可以使用 root 身份运行 Minikube
解决方案 : 
- 使用非 Root 权限的账户
- 忽略警告 : minikube start --force

网络问题

java 复制代码
Get "https://cdn.dl.k8s.io/release/v1.27.4/bin/linux/amd64/kubectl": net/http: TLS handshake timeout

原因 : 国内无法下载

解决方案 :
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5 registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5
docker images -a
minikube cache add registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5

缺少组件

java 复制代码
#  requires conntrack to be installed in root's path
解决方案 : yum install -y conntrack

安装记录

java 复制代码
[root@12312 ~]# minikube start --force --image-mirror-country='cn' --driver=docker --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --registry-mirror=https://reg-mirror.qiniu.com --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.30.2.iso --kubernetes-version=v1.23.8
* minikube v1.31.2 on Centos 8.2.2004 (amd64)
! minikube skips various validations when --force is supplied; this may lead to unexpected behavior
* Using the docker driver based on user configuration
* The "docker" driver should not be used with root privileges. If you wish to continue as root, use --force.
* If you are running minikube within a VM, consider using --driver=none:
*   https://minikube.sigs.k8s.io/docs/reference/drivers/none/
* Using image repository registry.cn-hangzhou.aliyuncs.com/google_containers
* Using Docker driver with root privileges
* Starting control plane node minikube in cluster minikube
* Pulling base image ...
! minikube was unable to download registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.40, but successfully downloaded docker.io/kicbase/stable:v0.0.40 as a fallback image
* Creating docker container (CPUs=2, Memory=2200MB) ...
* Preparing Kubernetes v1.23.8 on Docker 24.0.4 ...
  - Generating certificates and keys ...
  - Booting up control plane ...
  - Configuring RBAC rules ...
  - Using image registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5
* Verifying Kubernetes components...
* Enabled addons: default-storageclass, storage-provisioner
* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
相关推荐
敲代码的小王!2 小时前
MD5加密算法和BCrypt密码加密算法
java·算法·安全
魔尔助理顾问3 小时前
一个简洁高效的Flask用户管理示例
后端·python·flask
李长渊哦6 小时前
使用Druid连接池优化Spring Boot应用中的数据库连接
数据库·spring boot·后端
Marcel1116 小时前
WSL2使用Kind创建K8S集群时出现IPV6网络创建失败
云原生·kubernetes·kind
web135085886356 小时前
【Spring Boot】Spring AOP动态代理,以及静态代理
spring boot·后端·spring
罗政7 小时前
冒险岛079 V8 整合版源码搭建教程+IDEA启动
java·ide·intellij-idea
nbsaas-boot7 小时前
Go 自动升级依赖版本
开发语言·后端·golang
架构默片7 小时前
【JAVA工程师从0开始学AI】,第五步:Python类的“七十二变“——当Java的铠甲遇见Python的液态金属
java·开发语言·python
zzyh1234568 小时前
springcloud的组件及作用
后端·spring·spring cloud
不只会拍照的程序猿8 小时前
从插入排序到希尔排序
java·开发语言·数据结构·算法·排序算法