团队去年将代码管理迁移到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比较慢,需要一些简单配置,主要参考TUNA 和USTC 。
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 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) 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 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 ~/.kubesudo 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 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" runnerRegistrationToken: "xxxx" runnerToken: "D1zsss2nS6Lgkx5M4_zx" runners: 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
下面是配置文件详情。