介绍

本文主要介绍consul做为单纯的服务发现程序使用,在Kubernetes中安装的过程,以及碰到的问题和解决的方法。

一、环境介绍

项目内容备注
节点娄3master/node1/node2
操作系统Centos7.5 
内存2G 
CPU2核 
硬盘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

Logo

开源、云原生的融合云平台

更多推荐