如何快速且简单的部署
通过helm可以快速且简单的部署多种应用,关于helm的安装和使用请参考
环境信息本次实战的环境信息如下:
kubernetes集群:三台CentOS7.7服务器
kubernetes版本:1.15.3
helm版本:2.16.1
jenkins版本:
准备工作除了提前准备好kubernetes环境,还需要做好以下准备工作:
准备好helm,您可以参考《》
准备好NFS服务,这样就算jenkins的pod被销毁重建,也不会丢失数据,NFS服务的搭建,您可以参考《》
准备完成后可以开始实战了
本次实战使用名为helm-jenkins的namespace,执行以下命令创建:
kubectl create namespace helm-jenkins 创建PV为了后面的jenkins服务顺利启动,需要预先部署好pv:
新建名为pv-helm-jenkins.yaml的文件,内容如下:
apiVersion: v1 kind: PersistentVolume metadata: name: helm-jenkins namespace: helm-jenkins spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle nfs: path: /usr/local/work/test/002 server: 192.168.133.142执行命令kubectl create -f pv-helm-jenkins.yaml,创建pv
查看pv是否已经就绪:
[root@node1 helm-jenkins]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE helm-jenkins 10Gi RWO Recycle Available 5s 14h helm安装jenkins确保helm2.16.1版本安装完毕,并且可以正常工作:
[root@node1 helm-jenkins]# helm version Client: &version.Version{SemVer:"v2.16.1", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.16.1", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}确保以下的helm repo准备好(如果没有可以通过helm repo add添加):
[root@node1 helm-jenkins]# helm repo list NAME URL stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts执行以下命令,即可创建jenkins的deployment、service等资源:
helm install --namespace helm-jenkins --name my-jenkins stable/jenkins执行完毕后,控制台输出以下内容:
NOTES: 1. Get your 'admin' user password by running: printf $(kubectl get secret --namespace helm-jenkins my-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo 2. Get the Jenkins URL to visit by running these commands in the same shell: NOTE: It may take a few minutes for the LoadBalancer IP to be available. You can watch the status of by running 'kubectl get svc --namespace helm-jenkins -w my-jenkins' export SERVICE_IP=$(kubectl get svc --namespace helm-jenkins my-jenkins --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}") echo $SERVICE_IP:8080/login 3. Login with the password from step 1 and the username: admin上述内容的第一条给出了重要提示:获取admin账号密码的方法,执行命令即可:
printf $(kubectl get secret --namespace helm-jenkins my-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo如下图红框所示,我这里得到了admin密码为Eq6WxHvJ2V:
检查服务,发现helm-jenkins这个namespace下有两个服务:my-jenkins和my-jenkins-agent,前者就是jenkins网站,后者用来接收执行任务的jenkins实例的注册:
[root@node1 helm-jenkins]# kubectl get svc -n helm-jenkins NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-jenkins LoadBalancer 10.233.10.35 <pending> 8080:31763/TCP 31m my-jenkins-agent ClusterIP 10.233.35.20 <none> 50000/TCP 31mmy-jenkins这个服务的类型是LoadBalancer,8080端口被映射到宿主机的31763,因此,使用kubernetes集群中一台宿主机的IP,再加上31763端口即可通过浏览器访问,如下图:
至此,jenkins安装已完成,接下来要做必要的设置
设置kubernetes插件为了让jenkins在以下模式工作,还需要设置kubernetes插件
点击下图红框中的"Manage Jenkins",进入设置页面
由于很多插件版本较久,页面上会有升级提示,这里暂时用不到,因此直接点击下图红框中的"Configure System"
点击下图红框1中的"Test Connection”按钮,您会见到红框2中的错误信息:
产生上述错误的原因,是由于jenkins容器没有权限访问kubernetes的api server导致的,为了解决此问题,要先搞清楚容器的身份,我们知道容器在kubernetes环境中都有自己的serviceaccount,执行命令kubectl get serviceaccount -n helm-jenkins查看当前namespace下的serviceaccount:
[root@node1 helm-jenkins]# kubectl get serviceaccount -n helm-jenkins NAME SECRETS AGE default 1 3h55m可见jenkins容器的serviceaccount是default
知道了容器的serviceaccount,上述问题就好解决了,我们用RBAC将访问api server所需权限绑定给default即可,这里为了省事儿就不将权限一一列出了,接下来直接给default最高权限(生产环境千万别这么做,必须按需分配);