Kubernetes 1.19 国内镜像源部署,部署前后端服务,以及 Gitlab的helm部署

本篇博客将详细介绍如何在云服务器上搭建 Kubernetes 1.19 集群,以及在我们部署好的集群上使用 Helm 部署 gitlabminio 服务。

部署环境

  • 两台云服务器

    • 配置为:

      • 4 核 8GB 内存
      • 2 核 4GB 内存
    • 操作系统:ubuntu 18.04

目录

  • 搭建 Kubernetes 1.19 集群
  • 使用 helm 部署 gitlab 与 minio

1. 搭建 Kubernetes 1.19 集群

我的master节点设定为4核8gb的机器,这里称其为master,另一台机称为worker。

Step 1: 进入root用户的身份(master)

su

输入root的密码即可。

Step 2: 安装docker(master和worker都要操作)

关于 docker 的安装建议参考官方文档. 这里给出快速安装的脚本:

curl -fsSL https://get.docker.com | sudo sh -s -- --mirror Aliyun
sudo usermod -aG docker $USER
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
 "exec-opts": ["native.cgroupdriver=systemd"],
 "log-driver": "json-file",
 "log-opts": {
 "max-size": "100m"
 },
 "storage-driver": "overlay2",
 "registry-mirrors": ["https://t9ab0rkd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Step3: 安装 Kubernetes 三件套: kubelet kubeadm kubectl(仅在master)

# 添加并信任APT证书
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

# 添加源地址
add-apt-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"

# 更新源并安装最新版 kubenetes
sudo apt update && apt install -y kubelet kubeadm kubectl

# 添加 completion,最好放入 .bashrc 中
source <(kubectl completion bash)
source <(kubeadm completion bash)

Step4: 关闭 swap(master和worker都要操作)

这里由于腾讯云主机是默认关闭 swap 的,如果是其他主机,则执行以下操作并重启机器:

$ vim /etc/fstab
// 注释掉带有swap的一行
# UUID=xxxxxxxxx none            swap    sw              0       0

Step5: 启动 master(仅在master操作)

kubeadm init --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers'

这里指定了镜像源为阿里云,所以能够避免从 k8s.gcr.io 这个官方默认源拉取时失败。执行成功之后,会生成一串类似于如下格式的信息:

kubeadm join 172.16.0.15:6443 --token qi9srp.7sudphpyhmkm8sw6 \
    --discovery-token-ca-cert-hash sha256:a30870d86f7d19aff4d57a2dd64d58736012dfa3b3d5b53c0e45413ba8f039bf 

这串信息稍后会在加入worker节点的时候用到。

Step6: 配置读取路径(仅在master操作)

export KUBECONFIG=/etc/kubernetes/admin.conf

Step7:安装网络插件(仅在master操作)

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d 'n')" 

Step8:将 worker 节点加入到集群(仅在worker 操作)

如果有保存在master节点执行 kubeadm init 生成的信息,即:

kubeadm join 172.16.0.15:6443 --token qi9srp.7sudphpyhmkm8sw6 \
    --discovery-token-ca-cert-hash sha256:a30870d86f7d19aff4d57a2dd64d58736012dfa3b3d5b53c0e45413ba8f039bf 

可以直接复制过来使用. 没有保存的话,--token 可以通过 kubeadm token list 获取;--discovery-tolen-ca-cert-hash 可以通过下面的命令获取:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | sha256sum | awk '{print $1}'

Step9: 验证执行结果

Kubernetes 1.19 国内镜像源部署,部署前后端服务,以及 Gitlab的helm部署_第1张图片

2. 通过 yaml 文件部署前后端应用

由于服务计算的第九次作业开发了一个前后端分离的应用程序,并打包成了 docker 镜像,所以正好可以利用搭建好的集群部署前后端应用。查阅了 Kubernetes 官方文档后,我决定分别为前后端服务配置一个 Deployment 类型的资源和 Service 类型的资源。Deployment 类型资源负责管理 pod 的生命周期,调整动态伸缩的尺度,Service 负责暴露 Deployment 所对应的容器的端口到公网,使得服务可以在集群外部被访问。
下面介绍 yaml 文件的写法。

bbs_backend 的部署

Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bbs-backend
spec:
  selector:
    matchLabels:
      app: bbs-backend
      tier: backend
      track: stable
  replicas: 3       # 副本数
  template:
    metadata:
      labels:
        app: bbs-backend
        tier: backend
        track: stable
    spec:
      containers:
        - name: bbs-backend
          image: "docker.io/bobbai/bbs_backend"  # 这里pod要拉取的镜像 
          ports:
            - name: port
              containerPort: 5000   # 这里指定了基于镜像创建容器之后服务所在的端口
Service
apiVersion: v1
kind: Service
metadata:
  name: bbs-backend-service
spec:
  selector:
    app: bbs_backend
    tier: backend
  ports:
  - protocol: "TCP"        # 服务提供的协议
    port: 5000             # service暴露在cluster ip上的端口,:port 是提供给集群内部客户访问service的入口。
    targetPort: 5000       # targetPort是pod上的端口,从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器
    nodePort: 30086        # 暴露在公网的端口,服务可以通过 :nodePort 访问
  type: NodePort

bbs_frontend 的部署

这里yaml文件与后端部署所用到的类似,不再重复,直接上文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: bbs-frontend
spec:
  selector:
    matchLabels:
      app: bbs-frontend
      tier: frontend
      track: stable
  replicas: 3
  template:
    metadata:
      labels:
        app: bbs-frontend
        tier: frontend
        track: stable
    spec:
      containers:
        - name: bbs-frontend
          image: "docker.io/bobbai/bbs_frontend:k8s"
          ports:
            - name: port
              containerPort: 3000

---

apiVersion: v1
kind: Service
metadata:
  name: bbs-frontend-service
spec:
  selector:
    app: bbs-frontend
    tier: frontend
  ports:
  - protocol: "TCP"
    port: 3000
    targetPort: 3000
    nodePort: 30087
  type: NodePort

执行:

kubectl apply -f bbs_backend -n bbs
kubectl apply -f bbs_frontend -n bbs

后,可以通过 dashboard 查看服务是否部署成功:
Kubernetes 1.19 国内镜像源部署,部署前后端服务,以及 Gitlab的helm部署_第2张图片

3. Gitlab 的 Helm 部署

Gitlab 是什么?Gitlab 是一个非常著名的开源项目管理工具。除了具有管理进度,项目版本等基本功能之外,gitlab还附带有一个强大的 CI/CD 系统,这使得项目的自动化测试,部署变得十分方便。

为什么要是用 Helm 进行部署呢?按照官方文档提供的,使用 yaml 文件部署一个服务的话,正常来说需要编写 yaml 文件来声明相应的 Deployment, Service, PersistentVolumeClaim, PersistentVolume 等等资源。如果后续要对于资源的一些属性,比如 PersistentVolume 的挂载目录,卷的大小等等就会比较麻烦。Helm 则提供了一种模版化的方式,将服务的属性提取到一个统一的文件中,然后只需要修改一次,就能在整个服务中生效,同时它也为Kubernetes 生态中的服务提供了包管理的功能,方便用户在自己的集群下快速部署提供了 helm chart 的服务。
关于 Helm 的安装,可以参考官方文档,这里不再详细说明.

(1) Gitlab 的 Helm 部署

step1: 添加 helm 源(在master执行)

helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo add apphub https://apphub.aliyuncs.com/

step2: 下载 gitlab-ce 的 charts

helm pull stable/gitlab-ce
// 目录下会生成一个 gitlab-ce-版本号的压缩包,通过tar命令解压即可
tar  -zxvf  gitlab-ce-xxx.tgz

解压后应当生成了一个名为 gitlab-ce 的目录

step3: 进入解压后的目录,并根据需求修改 values.yaml 文件

cd gitlab-ce
vim values.yaml

Kubernetes 1.19 国内镜像源部署,部署前后端服务,以及 Gitlab的helm部署_第3张图片
这几处需要我们根据需求来修改,externalUrl 可以随意写,后续可以修改; 由于我并没有购置额外的load balancer 服务,所以想要暴露服务,只能使用 NodePort 类型。

step4:适配 1.19 集群(如果您的集群是1.16版本之前的,则这一步可以忽略)

kubernetes 每个版本的yaml文件版本都有所不同,需要我们根据自己集群的版本进行适配,即修改 helm/template 中的一些 yaml 文件。

  • 修改1: vim gitlab-ce/templates/deployment.yaml

添加:
Kubernetes 1.19 国内镜像源部署,部署前后端服务,以及 Gitlab的helm部署_第4张图片

  • 修改2: vim gitlab-ce/charts/postgresql/templates/deployment.yaml

添加:
Kubernetes 1.19 国内镜像源部署,部署前后端服务,以及 Gitlab的helm部署_第5张图片

  • 修改3:vim gitlab-ce/charts/redis/templates/deployment.yaml

Kubernetes 1.19 国内镜像源部署,部署前后端服务,以及 Gitlab的helm部署_第6张图片

step5:创建 PersistentVolume

由于gitlab需要将 postgres, redis 的数据持久化,因此如果此时根据gitlab-ce的charts来创建服务,由于我们并没有声明对应到gitlab自带的 PersistentVolumeClaim 对应的挂载目录下的 PersistentVolume, 服务就无法正常启动。因此,我们首先创建四个文件夹:

mkdir -p /data/gitlab/pv{1..4}

然后创建4个声明pv的yaml文件,模版如下:

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlab-pv1
  namespace: gitlab
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 10Gi
  hostPath:
    path: /data/gitlab/pv1
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem

然后依次 apply 这些 yaml 文件:

kubectl apply -f pv1.yaml
kubectl apply -f pv2.yaml
kubectl apply -f pv3.yaml
kubectl apply -f pv4.yaml

随后查看 pv 的状态
截屏2020-12-18 上午10.54.05.png
证明创建成功

step6:创建服务

输入:

helm install gitlab gitlab-ce -n gitlab

这里,-n 参数指定了服务的命名空间,您可以根据需求自行更改。

查看服务状态:
Kubernetes 1.19 国内镜像源部署,部署前后端服务,以及 Gitlab的helm部署_第7张图片
证明部署成功。

你可能感兴趣的:(kubernetes,gitlab,docker,devops)