关注「Raymond运维」公众号,并设为「星标」,第一时间获取更多运维等文章,不再错过精彩内容。
一. 前言
之前用 阿里云零成本搭建了一个 DevOps 方案,这一篇来继续进行扩展。
起因:单纯的 Docker 部署实现集群困难,无法做更复杂的处理。本篇目标:实现 K8S 集群的部署,同时部署多个应用
基于的技术 :Minikube + 云效 + Docker + K8S
云效发布确实让我们把应用发布为 Docker 的方式部署在服务器上面,但是 缺少了自动编排的过程,让服务远达不到持续部署的效果(PS : 我要搭建一个秒杀的微服务集群) ,这个时候就需要搭配 Kubernetes 进行使用了。
主要是为了验证集群的配置,所以集群的创建会以工具直接实现,这里使用的是 Minikube,只验证单机集群,后续再研究多物理机集群,循序渐进嘛。
二. Minikube 安装
下载 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
启动 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 集群
查看安装情况
- 查看版本 :minikube version
- 查看且安装 kubectl :minikube kubectl version
停止 minikube: minikube stop
删除 minikube: minikube delete
转换 kubectl 命令 (否则需要一直添加 minikube 前缀)
- 首先查询命令的位置 :find -name kubectl
- 迁移命令到 bin 目录 :cp var/lib/docker/volumes/minikube/_data/lib/minikube/binaries/v1.23.8/kubectl bin/
- kubectl version
通过 Kubectl 配置 minikube 集群
kubectl config use-context minikube
查询集群配置情况
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

其他命令
查询插件列表: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

至此 ,我们自己的 K8S 集群就搭建完成,成功运行了一个 Nginx 项目,下面要把我们的应用发布到集群里面去
虽然这里使用的是 MiniKube , 这个偏本地或者单机使用,但是核心还是用的 kubectl 和 Config ,这些都是通用的,后面是可以无损切换的。
四. DevOps 集成
这里基于云效的自定义容器集群方式 :
4.1 配置好 K8S 集群配置

查询对应的 .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 修改为集群主机域名
修改后的 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-certificate 和 client-key , 填入的是 Base64 后的 client.crt 和 client.key 不用传入证书配置,用 insecure-skip-tls-verify 忽略
4.2 配置云效发布方式
前面和上一篇都是类似的:花 20 分钟白嫖一整套 DevOps 发布方案,只看最后的 Kubernetes 发布部分。

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

// start.sh
exec java -jar quick.jar ""
4.3 访问结果


全部启动完成,访问也没有什么问题
// 配置访问端口
kubectl get deployments -A |grep quick
// 配置外部访问地址
kubectl expose deploy quick --type=NodePort --port=8012 --target-port=8080
kubectl get svc

总结
遗留下来的问题 :
多物理机部署 不算很白嫖,需要一个物理机部署 K8S 集群 IP 配置,网络连接,交互访问还待完善
以上这些问题应该会在这个月处理掉,欢迎关注。
附录 :部署问题
未安装 Docker
* 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
权限问题
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
作者:AntBlack
出处:https://juejin.cn/post/7287914203034353721
微
信
群
WeChat group

为方便大家更好的交流运维等相关技术问题,特创建了微信交流群。需要加群的小伙伴们在关注微信公众号后,点击底部菜单关于→联系我,即可获取加群方式。
博客
客
Blog


CSDN博客

掘金博客
长按识别二维码访问博客网站,查看更多优质原创运维等文章。




