likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 18

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

一. 前言

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

核心重点 :

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

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

二. Minikube 安装

// 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



添加控制台

//  打开控制台
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


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

其他命令


// 查询插件列表
minikube addons list

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

// 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


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

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

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

四. DevOps 集成

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

4.1 配置好 K8S 集群配置

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

// 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 配置云效发布方式

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

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} 都是我的变量 ,项目的结构如下 :

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

// start.sh
exec java -jar quick.jar ""

4.3 访问结果

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

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

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

// 配置访问端口
kubectl get deployments  -A |grep quick

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

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

总结

遗留下来的问题 :

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

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

附录 :部署问题

未安装 Docker

权限问题

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

网络问题

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


缺少组件

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


安装记录

[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