👈👈👈 欢迎点赞收藏关注哟
首先分享之前的所有文章 >>>> 😜😜😜
文章合集 : 🎁 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-certificate 和 client-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