kubernetes及Gitlab-Runner安装

团队去年将代码管理迁移到Gitlab后,尝试了CI/CD,用Gitlab-Runner来测试提交的代码是否有问题,用3台机器,kubeadm搭建了一个小的k8s运行环境。上个月25日突然反映runner不能正常运行,后台看了下是证书过期的原因,kubeadm v1.5后好像有证书更新的功能,之前用的好像是v1.2版本,证书更新起来不太方便。现在在做项目,没有时间去整理,还不如重新搭建算了。后来有时间的话,再尝试搭建k8s,the hard way,应该会对kubernetes更深一步的了解。

前段时间CentOS 8发布了,也试了下CentOS 8,但是各方软件兼容还存在一点问题,比如Docker,后来还是以CentOS 7为操作系统。vSphere里新建一台机器,各参数设置好后,再Clone两台,修改IP和hostname就OK,省一些系统安装的时间。

Docker准备

Docker安装比较简单,按官方指引来就OK,因其它原因国内下载Docker Image比较慢,需要一些简单配置,主要参考TUNAUSTC

1
2
3
4
5
6
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum install yum-utils device-mapper-persistent-data lvm2
yum install docker-ce
gpasswd -a user docker
systemctl enable --now docker
/etc/docker/daemon.json
1
2
3
4
5
6
7
8
9
10
11
12
{
"registry-mirrors": ["https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn/"],
"insecure-registries": ["10.17.65.22:8088"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"labels": "production_status",
"env": "os,customer"
},
"exec-opts": ["native.cgroupdriver=systemd"]
}

Kubeadm安装k8s

Kubeadm准备

Kubeadm安装参考官方文档。这次安装的版本是v1.16.2,版本不一样可能涉及到一些Docker Image不一样。可通过kubeadm config images list查看对应版本需要下载的镜像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
#gpgcheck=1
gpgcheck=0
EOF

# Set SELinux in permissive mode (effectively disabling it)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable --now kubelet

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

systemctl stop firewalld
sudo systemctl disable firewalld

Docker Image准备

因为某些原因无法从外网下载镜像,需要手动处理下,这里要感谢下阿里,提供了一个镜像下载地址。

./k8s_mirror.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

images=(kube-apiserver:v1.16.2
kube-controller-manager:v1.16.2
kube-scheduler:v1.16.2
kube-proxy:v1.16.2
pause:3.1
etcd:3.3.15-0
coredns:1.6.2)
#flannel:v0.11.0-amd64

# or bluersw/image:version
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName 10.17.65.22:8088/$imageName
#docker push 10.17.65.22:8088/$imageName
done

写好脚本后,直接运行这个脚本,把需要的Image拉下来。

k8s节点

k8s的节点安装参考官方文档

1
2
3
4
5
sudo kubeadm init --kubernetes-version=v1.16.2 --apiserver-advertise-address=10.17.65.250 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.1.0.0/16
mkdir -p ~/.kube
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config
sudo chown liangwu:liangwu ~/.kube/config
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

其它节点根据kubeadm init后的提示直接kubeadm join就好了。前提也是需要把一些镜像拉下来

  • k8s.gcr.io/pause:3.1
  • k8s.gcr.io/kube-proxy:v1.16.2
  • quay.io/coreos/flannel:v0.11.0-amd64

Gitlab-Runner Helm安装

安装Helm

参照官方文档,作简要配置。

rbac-config.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system

然后运行kubectl create -f rbac-config.yaml。或者其它方式。主要是RBAC的问题。

1
2
3
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

Helm配置

Helm也涉及到一些被墙的东西,换下拉取地址。再次感谢阿里? :)

1
2
helm repo add gitlab https://charts.gitlab.io/
helm init -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.5.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts --service-account tiller --history-max 200

Gitlab Runner安装

Gitlab Runner的文档确实好像不怎么样,好多东西都没写,或者写得不好。

1
2
3
4
5
#values.yaml需要根据自己实际情况进行修改,各项都有说明
wget -c https://gitlab.com/gitlab-org/charts/gitlab-runner/raw/master/values.yaml?inline=false
helm fetch gitlab/gitlab-runner
tar xvf gitlab-runner-${version}.tgz
helm install --namespace gitlab --name gitlab-runner -f values.yaml ./gitlab-runner-${version}

values.yaml有以下几点需要注意的。

values.yaml
1
2
3
4
5
6
7
8
9
imagePullPolicy: IfNotPresent
gitlabUrl: "http://10.17.65.22:5622/gitlab"
#注册新runner
runnerRegistrationToken: "xxxx"
#已有runner的token
runnerToken: "D1zsss2nS6Lgkx5M4_zx"
runners:
#从私有docker registry中拉取image时需要的认证信息,可参考原values.yaml中的k8s官方链接说明
imagePullSecrets: ["regcred"]

我们Gitlab CI/CD中有个验证就是利用maven编译代码是否可通过,其中需要拉取很多供事的jar包,每次都拉取比较耗时,虽然都从局域网的私服拉。可将.m2的缓存存在node本机,小的k8s就这么做吧。懒得去设置PV,PVC了。以后需要大的k8s,再去整PV吧。NFS啊,MinIO之类的。在helm包文件里修改templates/configmap.yaml,在start gitlab runner之前加入以下内容。已经在Gist中加入。

gitlab-runner/templates/configmap.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
### ...

cat >>/home/gitlab-runner/.gitlab-runner/config.toml <<EOF
[[runners.kubernetes.volumes.host_path]]
name = "m2"
mount_path = "/root/.m2"
host_path = "/m2"
[[runners.kubernetes.volumes.host_path]]
name = "cache"
mount_path = "/cache"
host_path = "/cache"
EOF

### ...

下面是配置文件详情。