Kubernetes中安装Consul服务过程及问题解决
介绍本文主要介绍consul做为单纯的服务发现程序使用,在Kubernetes中安装的过程,以及碰到的问题和解决的方法。一、环境介绍项目内容备注节点娄3master/node1/node2操作系统Centos7.5内存2GCPU2核硬盘40G这次的安装是基于个人在天翼云上申请的主机上安装的,所以服务器的配置比较低,特别是存储空间,单机40G已经是所有...
介绍
本文主要介绍consul做为单纯的服务发现程序使用,在Kubernetes中安装的过程,以及碰到的问题和解决的方法。
一、环境介绍
项目 | 内容 | 备注 |
节点娄 | 3 | master/node1/node2 |
操作系统 | Centos7.5 | |
内存 | 2G | |
CPU | 2核 | |
硬盘 | 40G |
这次的安装是基于个人在天翼云上申请的主机上安装的,所以服务器的配置比较低,特别是存储空间,单机40G已经是所有空间,并且还需要被操作系统使用一部分,不过做为测试使用,已经足够了。
二、准备工作
1、安装NFS服务
由于Kubernetes集群的特性,其存储资源需要基于网络,NFS做为常用的网络文件系统,可很好的被它应用,便是要注意,NFS服务需要在每台NODE的宿主机上部署,否则会因为系统不支持NFS文件类型,而导致consul-server的pod启动失败。
2、存储卷的准备
由于Consul需要存储固化的数据,其在安装的时候会部署StatfullSet的组件,会通过pvc向pv申请存储资源,所以我需要事先为Kubernetes集群部署Storage Classes。否则,在部署Consul时,由于consul-server申请不到存储资源而无法启动。
3、Kubernetes节点的准备
由于Helm管理的Consul集群创建脚本默认是3(服务器)+2(客户端)的方案,所以Kubernetes最少需要3个节点,并且当只有3个节点为,并且master也是节点之一时,需要为master设置为可部署节点,否则consul集群会因为其中一个consul-server没有可部署节点而无法启动。
三、开始安装
1、nfs的安装
# 安装nfs服务:yum -y install nfs-utils (集群中的每个节点也要安装否则不支持)
yum install nfs-utils -y
# 启动nfs并设为开机自启
systemctl start nfs && systemctl enable nfs
# 创建共享挂载目录
mkdir -pv /data/k8s/{v1,v2,v3}
cat >/etc/export<EOF
/data/k8s/v1 192.168.1.0/24(rw,no_root_squash)
/data/k8s/v2 192.168.1.0/24(rw,no_root_squash)
/data/k8s/v2 192.168.1.0/24(rw,no_root_squash)
EOF
# 发布
exportfs -avr
# exporting 192.168.1.0/24:/data/k8s/v3
# exporting 192.168.1.0/24:/data/k8s/v2
# exporting 192.168.1.0/24:/data/k8s/v1
# 查看
showmount -e
/data/k8s/v3 192.168.1.0/24
/data/k8s/v2 192.168.1.0/24
/data/k8s/v1 192.168.1.0/24
这里注意 nfs-utils需要在每个节点上安装,以使系统能够支持NFS文件系统。下面的共享目录的设置,只需要在存储服务器上设置就可以了。
2、部署存储卷StorageClass
编写部署用的yaml文件
cat >nfs-client.yaml<<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: node2
- name: NFS_PATH
value: /data/k8s/v1
volumes:
- name: nfs-client-root
nfs:
server: node2
path: /data/k8s/v1
EOF
应用
kubectl apply -f nfs-client.yaml
创建account并绑定角色
cat >nfs-client-sa.yaml<<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
EOF
kubectl apply -f nfs-client-sa.yaml
创建storageclass,并部署到Kubernetes
cat >nfs-client-class.yaml<<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: course-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
EOF
kubectl apply -f nfs-client-class.yaml
3、为master节点配置为可部署节点
出于安全考虑,默认配置下Kubernetes不会将Pod调度到Master节点。如果希望将k8s-master也当作Node使用,可以执行如下命令:
kubectl taint node jaine-vpc01 node-role.kubernetes.io/master-
其中k8s-master是主机节点的hostname,如果要恢复Master Only状态,执行如下命令:
kubectl taint node k8s-master node-role.kubernetes.io/master=""
4、安装Consul
因为我的主机存储空间比较小,而默认的helm中配置的每个节点申请的存储空间是10G,所以需要改一下这个参数,我这里设置的是2G,另外,通过这个步骤,也同时把consul的web页面设置为启用,这些配置参数存储在config.yaml文件中:
cat >config.yaml<<EOF
# config.yaml
server:
# storage and storageClass are the settings for configuring stateful
# storage for the server pods. storage should be set to the disk size of
# the attached volume. storageClass is the class of storage which defaults
# to null (the Kube cluster will pick the default).
storage: 2Gi
storageClass: "default"
# Enable and configure the Consul UI.
ui:
enabled: true
# Configure security for Consul Connect pod injection
connectInject:
enabled: true
default: true
aclBindingRuleSelector: “serviceaccount.name!=default”
EOF
通过helm安装consul
helm install consul -f config.yaml hashicorp/consul --set global.name=consul
通过上面的过程,安装基本完成,如果K8S中安装了ingress-nginx的话,可以通过规则访问consul-server的8500端口,就可以打开consul的ui界面,查看consul中注册服务的状态。
另外,consul的卸装方式如下:
helm delete consul
kubectl delete pvc -l chart=consul-helm
5、在consul中注册服务
编辑注册服务的json脚本,保存为test.json:
{
"ID": "test-service1",
"Name": "test-service1",
"Tags": [
"test",
"v1"
],
"Address": "127.0.0.1",
"Port": 8000,
"Meta": {
"X-TAG": "testtag"
},
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://test.com",
"Interval": "10s"
}
}
通过 http 接口注册服务:
# test.consul.local 是在本地hosts文件中指定的consul访问地址
curl -X PUT --data @test.json http://test.consul.local:8500/v1/agent/service/register
参考资料
1、Consul and Kubernetes Deployment Guide https://learn.hashicorp.com/tutorials/consul/kubernetes-deployment-guide?utm_source=consul.io&utm_medium=docs
2、k8s学习(十七) 配置并使用storageclass https://blog.csdn.net/u011943534/article/details/100887530
3、docker及k8s安装consul https://www.cnblogs.com/caibao666/p/11582909.html
更多推荐
所有评论(0)