9-Kubernetes-cockroachdb-nfs集群部署

347 阅读8分钟

Kubernetes-cockroachdb-nfs单机版部署

背景

简单的在kubernetes上基于nfs动态存储部署cockroachdb

一、环境准备,安装kubernetes集群

​ 当前节点base、master、node1、node2、node3

kubernetes安装不在此赘述,请参考参考资料进行安装

kubernetes安装nfs不在此赘述,请参考参考资料进行安装

​ 参考资料

/kubernetes/1-Kubernetes基于Centos7构建基础环境(一)

/kubernetes/2-Kubernetes基于Centos7构建基础环境(二)

/kubernetes/3-Kubernetes基于Centos7构建基础环境(三)

4-Kubernetes-基于Centos7安装面板及监控(四)

/kubernetes/nfs/1-kubernetes-nfs动态存储部署

集群名称集群域名说明
basebase.xincan.cn部署harbor、nfs等服务
mastermaster.xincan.cnkubernetes主节点,做污点容忍,排除业务资源,nfs客户端等
node1node1.xincan.cnkubernetes从节点,nfs客户端等
node2node2.xincan.cnkubernetes从节点,nfs客户端等
node3node3.xincan.cnkubernetes从节点,nfs客户端等

二、总体流程:

  1. 当前cockroachdb的版本为v21.1.4
    • cockroachdb/cockroach:v21.1.4
    • cockroachdb/cockroach-k8s-request-cert:0.4
  2. Kubernetes集群的主节点上创建cockroachdb文件夹,用于存放下载资源,和Kuberntes文件编排,文件目录如下;
    • git文件夹下的文件是参考文件
[root@master cockroachdb]# tree

├── 1-cockroachdb-namespace.yaml
├── 2-cockroachdb-sa.yaml
├── 3-cockroachdb-provisioner.yaml
├── 4-cockroachdb-storage.yaml
├── 5-cockroachdb-service.yaml
├── 6-cockroachdb-poddisruptionbudget.yaml
├── 7-sentinel-statefuset.yaml
├── client
    ├── 1-cluster-secure.yaml
├── init
    ├── 1-cluster-init-secure.yaml
└── git
    └── cockroach
        └── cloud
            └── kubernetes
               ├── client-secure.yaml
               ├── cluster-init-secure.yaml
               ├── cluster-init.yaml
               ├── cockroachdb-statefulset-secure.yaml
               ├── cockroachdb-statefulset.yaml
               ├── demo.sh
               ├── example-app-secure.yaml
               ├── example-app.yaml
               ├── fluentd-configmap.yml
               └── README.md
    
  1. cockroachdb文件夹下创建git,然后进入git,通过git获取cockroachdb应用;
  2. 镜像制作;
  3. 资源创建;
  4. 效果展示;

三、下载cockroachdb

  1. git下载cockroach
[root@master git]# https://hub.fastgit.org/cockroachdb/cockroach.git
  1. 下载镜像
    • 在base机器上下载镜像
    • 下载镜像:docker pull cockroachdb/cockroach:v21.1.4
    • 下载镜像:docker pull cockroachdb/cockroach-k8s-request-cert:0.4
    • 将镜像打包到Harbor私服
[root@base ~]# docker pull cockroachdb/cockroach:v21.1.4
[root@base ~]# docker tag cockroachdb/cockroach:v21.1.4 base.hatech.com.cn/cockroachdb/cockroach:v21.1.4
[root@base ~]# docker push base.hatech.com.cn/cockroachdb/cockroach:v21.1.4

[root@base ~]# docker pull cockroachdb/cockroach-k8s-request-cert:0.4
[root@base ~]# docker tag cockroachdb/cockroach-k8s-request-cert:0.4 base.hatech.com.cn/cockroachdb/cockroach-k8s-request-cert:0.4
[root@base ~]# docker push base.hatech.com.cn/cockroachdb/cockroach-k8s-request-cert:0.4

四、资源创建

​ 参照cockroachdb/git/cockroach/cloud/kubernetes下的编排文件,进行改动

  1. 创建cockroachdb的命名空间Namespace,名称为:cockroachdb
    • 将所有的资源挂载到此命名空间下
[root@master cockroachdb]# vim 1-cockroachdb-namespaces.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: cockroachdb
  labels:
    app: cockroachdb
  1. 创建cockroachdb权限配置ServiceAccount、ClusterRole、ClusterRoleBinding、Role、RoleBinding,名称为:cockroachdb
[root@master cockroachdb]# vim 2-cockroachdb-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: cockroachdb
  namespace: cockroachdb
  labels:
    app: cockroachdb

---


apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: cockroachdb
  namespace: cockroachdb
  labels:
    app: cockroachdb
rules:
- apiGroups:
  - ""
  resources:
  - secrets
  verbs:
  - create
  - get

---


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cockroachdb
  namespace: cockroachdb
  labels:
    app: cockroachdb
rules:
- apiGroups:
  - certificates.k8s.io
  resources:
  - certificatesigningrequests
  verbs:
  - create
  - get
  - watch

---


apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cockroachdb
  namespace: cockroachdb
  labels:
    app: cockroachdb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: cockroachdb
subjects:
- kind: ServiceAccount
  name: cockroachdb
  namespace: cockroachdb

---


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cockroachdb
  namespace: cockroachdb
  labels:
    app: cockroachdb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cockroachdb
subjects:
- kind: ServiceAccount
  name: cockroachdb
  namespace: cockroachdb
  1. 创建NFS资源Deployment,名称为:cockroachdb-nfs-provisionerr
    • mountPath: /persistentvolumes 该文件夹是nfs-client-provisioner镜像运行之后容器内部固定的文件夹它会mount/hatech/nfs/data/xincan/cockroachdb nfs服务器cockroachdb 文件夹下
    • value: 192.168.1.80 该地址是对应NFS服务器地址
    • path: /hatech/nfs/data/xincan/cockroachdb path地址路径则是NFS服务器自己创建挂载点的文件路径,也就是后续数据库存储的位置
[root@master cockroachdb]# vim 3-cockroachdb-provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cockroachdb-nfs-provisioner
  labels:
    app: cockroachdb-nfs-provisioner
  # replace with namespace where provisioner is deployed
  namespace: cockroachdb
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: cockroachdb-nfs-provisioner
  template:
    metadata:
      labels:
        app: cockroachdb-nfs-provisioner
    spec:
      serviceAccountName: cockroachdb
      containers:
        - name: cockroachdb-nfs-provisioner
          image: base.hatech.com.cn/library/nfs-client-provisioner:v1.5.2
          volumeMounts:
            - name: cockroachdb-nfs-client-root
              # 该文件夹是nfs-client-provisioner运行之后容器内部固定的文件夹它会mount到/nfs/data/nginx nfs服务器nginx文件夹下
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.1.80
            - name: NFS_PATH
              value: /hatech/nfs/data/xincan/cockroachdb
      volumes:
        - name: cockroachdb-nfs-client-root
          nfs:
            server: 192.168.1.80
            path: /hatech/nfs/data/xincan/cockroachdb
  1. 创建cockroachdb主节点StorageClass,名称为:cockroachdb-nfs-storage

    • 后续pv、pvc通过Deployment动态创建
[root@master cockroachdb]# vim 4-cockroachdb-storage.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: cockroachdb-nfs-storage
  namespace: cockroachdb
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  archiveOnDelete: "false"
  1. 创建cockroachdb服务外暴露访问资源Service,名称为:cockroachdb-service,cockroachdb-public,cockroachdb
  • mysql-service:对外暴露服务
[root@master cockroachdb]# vim 5-cockroachdb-service.yaml

apiVersion: v1
kind: Service
metadata:
  namespace: cockroachdb
  name: cockroachdb-service
  labels:
    app: cockroachdb
spec:
  type: NodePort
  ports:
  - port: 26257
    targetPort: 26257
    nodePort: 31181
    name: grpc
  - port: 8080
    targetPort: 8080
    nodePort: 31180
    name: http
  selector:
    app: cockroachdb

---


apiVersion: v1
kind: Service
metadata:
  # This service is meant to be used by clients of the database. It exposes a ClusterIP that will
  # automatically load balance connections to the different database pods.
  namespace: cockroachdb
  name: cockroachdb-public
  labels:
    app: cockroachdb
spec:
  ports:
  # The main port, served by gRPC, serves Postgres-flavor SQL, internode
  # traffic and the cli.
  - port: 26257
    targetPort: 26257
    name: grpc
  # The secondary port serves the UI as well as health and debug endpoints.
  - port: 8080
    targetPort: 8080
    name: http
  selector:
    app: cockroachdb

---


apiVersion: v1
kind: Service
metadata:
  # This service only exists to create DNS entries for each pod in the stateful
  # set such that they can resolve each other's IP addresses. It does not
  # create a load-balanced ClusterIP and should not be used directly by clients
  # in most circumstances.
  name: cockroachdb
  namespace: cockroachdb
  labels:
    app: cockroachdb
  annotations:
    # Use this annotation in addition to the actual publishNotReadyAddresses
    # field below because the annotation will stop being respected soon but the
    # field is broken in some versions of Kubernetes:
    # https://github.com/kubernetes/kubernetes/issues/58662
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
    # Enable automatic monitoring of all instances when Prometheus is running in the cluster.
    prometheus.io/scrape: "true"
    prometheus.io/path: "_status/vars"
    prometheus.io/port: "8080"
spec:
  ports:
  - port: 26257
    targetPort: 26257
    name: grpc
  - port: 8080
    targetPort: 8080
    name: http
  # We want all pods in the StatefulSet to have their addresses published for
  # the sake of the other CockroachDB pods even before they're ready, since they
  # have to be able to talk to each other in order to become ready.
  publishNotReadyAddresses: true
  clusterIP: None
  selector:
    app: cockroachdb
  1. 创建cockroachdb主节点PodDisruptionBudget,名称为:cockroachdb-budget
[root@master cockroachdb]# vim 6-cockroachdb-poddisruptionbudget.yaml

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: cockroachdb-budget
  namespace: cockroachdb
  labels:
    app: cockroachdb
spec:
  selector:
    matchLabels:
      app: cockroachdb
  maxUnavailable: 1
  1. 创建cockroachdb无头服务StatefulSet,名称为:根据metadata.name+“-”+实例序号,序号从0开始,如我的最后结果是:cockroachdb-0,cockroachdb-1、cockroachdb-2
  • replicas: 3 最终会生成3分cockroachdb实例
[root@master cockroachdb]# vim 7-cockroachdb-statefuset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: cockroachdb
  namespace: cockroachdb
spec:
  serviceName: "cockroachdb"
  replicas: 3
  selector:
    matchLabels:
      app: cockroachdb
  template:
    metadata:
      labels:
        app: cockroachdb
    spec:
      serviceAccountName: cockroachdb
      # Init containers are run only once in the lifetime of a pod, before
      # it's started up for the first time. It has to exit successfully
      # before the pod's main containers are allowed to start.
      initContainers:
      # The init-certs container sends a certificate signing request to the
      # kubernetes cluster.
      # You can see pending requests using: kubectl get csr
      # CSRs can be approved using:         kubectl certificate approve <csr name>
      #
      # All addresses used to contact a node must be specified in the --addresses arg.
      #
      # In addition to the node certificate and key, the init-certs entrypoint will symlink
      # the cluster CA to the certs directory.
      - name: init-certs
        image: base.hatech.com.cn/cockroachdb/cockroach-k8s-request-cert:0.4
        imagePullPolicy: IfNotPresent
        command:
        - "/bin/ash"
        - "-ecx"
        - "/request-cert -namespace=${POD_NAMESPACE} -certs-dir=/cockroach-certs -type=node -addresses=localhost,127.0.0.1,$(hostname -f),$(hostname -f|cut -f 1-2 -d '.'),cockroachdb-public,cockroachdb-public.$(hostname -f|cut -f 3- -d '.'),cockroachdb-public.$(hostname -f|cut -f 3-4 -d '.'),cockroachdb-public.$(hostname -f|cut -f 3 -d '.') -symlink-ca-from=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: certs
          mountPath: /cockroach-certs
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - cockroachdb
              topologyKey: kubernetes.io/hostname
      containers:
      - name: cockroachdb
        image: base.hatech.com.cn/cockroachdb/cockroach:v21.1.4
        imagePullPolicy: IfNotPresent
        # TODO: Change these to appropriate values for the hardware that you're running. You can see
        # the resources that can be allocated on each of your Kubernetes nodes by running:
        #   kubectl describe nodes
        # Note that requests and limits should have identical values.
        resources:
          requests:
            cpu: "2"
            memory: "8Gi"
          limits:
            cpu: "2"
            memory: "8Gi"
        ports:
        - containerPort: 26257
          name: grpc
        - containerPort: 8080
          name: http
# We recommend that you do not configure a liveness probe on a production environment, as this can impact the availability of production databases.
#       livenessProbe:
#         httpGet:
#           path: "/health"
#           port: http
#           scheme: HTTPS
#         initialDelaySeconds: 30
#         periodSeconds: 5
        readinessProbe:
          httpGet:
            path: "/health?ready=1"
            port: http
            scheme: HTTPS
          initialDelaySeconds: 10
          periodSeconds: 5
          failureThreshold: 2
        volumeMounts:
        - name: datadir
          mountPath: /cockroach/cockroach-data
        - name: certs
          mountPath: /cockroach/cockroach-certs
        env:
        - name: COCKROACH_CHANNEL
          value: kubernetes-secure
        - name: GOMAXPROCS
          valueFrom:
            resourceFieldRef:
              resource: limits.cpu
              divisor: "1"
        - name: MEMORY_LIMIT_MIB
          valueFrom:
            resourceFieldRef:
              resource: limits.memory
              divisor: "1Mi"
        command:
          - "/bin/bash"
          - "-ecx"
          # The use of qualified `hostname -f` is crucial:
          # Other nodes aren't able to look up the unqualified hostname.
          # Memory caches are set as a fraction of the pod's memory limit.
          - exec
            /cockroach/cockroach
            start
            --logtostderr
            --certs-dir /cockroach/cockroach-certs
            --advertise-host $(hostname -f)
            --http-addr 0.0.0.0
            --join cockroachdb-0.cockroachdb,cockroachdb-1.cockroachdb,cockroachdb-2.cockroachdb
            --cache $(expr $MEMORY_LIMIT_MIB / 4)MiB
            --max-sql-memory $(expr $MEMORY_LIMIT_MIB / 4)MiB
      # No pre-stop hook is required, a SIGTERM plus some time is all that's
      # needed for graceful shutdown of a node.
      terminationGracePeriodSeconds: 60
      volumes:
      - name: datadir
        persistentVolumeClaim:
          claimName: datadir
      - name: certs
        emptyDir: {}
  podManagementPolicy: Parallel
  updateStrategy:
    type: RollingUpdate
  volumeClaimTemplates:
  - metadata:
      name: datadir
    spec:
      accessModes:
      - "ReadWriteOnce"
      storageClassName: cockroachdb-nfs-storage
      resources:
        requests:
          storage: 10Gi
  1. 创建cockroachdb资源
[root@master cockroachdb]# kubectl apply -f ../cockroachdb
  1. 查看部署的Pod
  • 此时一直是Init状态,initController等待批准授权
[root@master cockroachdb]# kubectl -n cockroachdb get pod
NAME                                           READY   STATUS     RESTARTS   AGE
cockroachdb-0                                  0/1     Init:0/1   0          55s
cockroachdb-1                                  0/1     Init:0/1   0          55s
cockroachdb-2                                  0/1     Init:0/1   0          55s
cockroachdb-nfs-provisioner-5767c7c4f5-rnsnv   1/1     Running    0          56s

五、 手动批准授权

  1. 查看CSR
    • 查看certificatesigningrequests.certificates.k8s.io
    • 可以简写成csr
[root@master cockroachdb]# kubectl -n cockroachdb get certificatesigningrequests.certificates.k8s.io
NAME                             AGE   SIGNERNAME                     REQUESTOR                                       CONDITION
cockroachdb.node.cockroachdb-0   57s   kubernetes.io/legacy-unknown   system:serviceaccount:cockroachdb:cockroachdb   Pending
cockroachdb.node.cockroachdb-1   55s   kubernetes.io/legacy-unknown   system:serviceaccount:cockroachdb:cockroachdb   Pending
cockroachdb.node.cockroachdb-2   57s   kubernetes.io/legacy-unknown   system:serviceaccount:cockroachdb:cockroachdb   Pending
  1. init-certs容器发送CSR批准使用
[root@master cockroachdb]# kubectl -n cockroachdb certificate approve cockroachdb.node.cockroachdb-{0,1,2}
certificatesigningrequest.certificates.k8s.io/cockroachdb.node.cockroachdb-0 approved
certificatesigningrequest.certificates.k8s.io/cockroachdb.node.cockroachdb-1 approved
certificatesigningrequest.certificates.k8s.io/cockroachdb.node.cockroachdb-2 approved
  1. 查看PodRunning状态,但还没有达到Ready
[root@master cockroachdb]# kubectl -n cockroachdb get pod
NAME                                           READY   STATUS    RESTARTS   AGE
cockroachdb-0                                  0/1     Running   0          6m21s
cockroachdb-1                                  0/1     Running   0          6m21s
cockroachdb-2                                  0/1     Running   0          6m21s
cockroachdb-nfs-provisioner-5767c7c4f5-rnsnv   1/1     Running   0          6m22s

六、初始化集群

  1. init文件夹下创建初始化Job
  2. 创建cockroachdbJob,名称为:cluster-init-secure
[root@master init]# vim 1-cluster-init-secure.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: cluster-init-secure
  namespace: cockroachdb
  labels:
    app: cockroachdb
spec:
  template:
    spec:
      serviceAccountName: cockroachdb
      initContainers:
      # The init-certs container sends a certificate signing request to the
      # kubernetes cluster.
      # You can see pending requests using: kubectl get csr
      # CSRs can be approved using:         kubectl certificate approve <csr name>
      #
      # In addition to the client certificate and key, the init-certs entrypoint will symlink
      # the cluster CA to the certs directory.
      - name: init-certs
        image: base.hatech.com.cn/cockroachdb/cockroach-k8s-request-cert:0.4
        imagePullPolicy: IfNotPresent
        command:
        - "/bin/ash"
        - "-ecx"
        - "/request-cert -namespace=${POD_NAMESPACE} -certs-dir=/cockroach-certs -type=client -user=root -symlink-ca-from=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: client-certs
          mountPath: /cockroach-certs
      containers:
      - name: cluster-init
        image: base.hatech.com.cn/cockroachdb/cockroach:v21.1.4
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: client-certs
          mountPath: /cockroach-certs
        command:
          - "/cockroach/cockroach"
          - "init"
          - "--certs-dir=/cockroach-certs"
          - "--host=cockroachdb-0.cockroachdb"
      restartPolicy: OnFailure
      volumes:
      - name: client-t-certs
        emptyDir: {}
  1. 执行创建
    • 查询Pod处在Init状态,应为需要手动批准授权
[root@master init]# kubectl apply -f 1-cluster-init-secure.yaml
job.batch/cluster-init-secure created

[root@master init]# kubectl -n cockroachdb get pod
NAME                                           READY   STATUS     RESTARTS   AGE
cluster-init-secure-2zbvl                      0/1     Init:0/1   0          12s
cockroachdb-0                                  0/1     Running    0          14m
cockroachdb-1                                  0/1     Running    0          14m
cockroachdb-2                                  0/1     Running    0          14m
cockroachdb-nfs-provisioner-5767c7c4f5-rnsnv   1/1     Running    0          14m
  1. 查看CSR并对其批准授权
    • 查看cockroachdb.client.root,处在Pending状态
    • 对其进行批准授权
[root@master init]# kubectl -n cockroachdb get csr
NAME                             AGE    SIGNERNAME                     REQUESTOR                                       CONDITION
cockroachdb.client.root          112s   kubernetes.io/legacy-unknown   system:serviceaccount:cockroachdb:cockroachdb   Pending
cockroachdb.node.cockroachdb-0   15m    kubernetes.io/legacy-unknown   system:serviceaccount:cockroachdb:cockroachdb   Approved,Issued
cockroachdb.node.cockroachdb-1   15m    kubernetes.io/legacy-unknown   system:serviceaccount:cockroachdb:cockroachdb   Approved,Issued
cockroachdb.node.cockroachdb-2   15m    kubernetes.io/legacy-unknown   system:serviceaccount:cockroachdb:cockroachdb   Approved,Issued

[root@master init]# kubectl -n cockroachdb certificate approve cockroachdb.client.root
certificatesigningrequest.certificates.k8s.io/cockroachdb.client.root approved
  1. 在次查看Pod
    • 初始化集群Job执行完成,状态为Completed
    • 发现cockroachdb集群Pod正常运行,状态为Running
    • 至此cockroachdb安装完成
[root@master init]# kubectl -n cockroachdb get pod
NAME                                           READY   STATUS      RESTARTS   AGE
cluster-init-secure-2zbvl                      0/1     Completed   0          3m11s
cockroachdb-0                                  1/1     Running     0          17m
cockroachdb-1                                  1/1     Running     0          17m
cockroachdb-2                                  1/1     Running     0          17m
cockroachdb-nfs-provisioner-5767c7c4f5-rnsnv   1/1     Running     0          17m

七、命令方式创建客户端链接

  1. 进入client文件夹下,创建1-client-secure.yaml资源
  2. 创建cockroachdbPod,名称为:cockroachdb-client-secure
[root@master client]# cat 1-client-secure.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cockroachdb-client-secure
  namespace: cockroachdb
  labels:
    app: cockroachdb-client
spec:
  serviceAccountName: cockroachdb
  initContainers:
  # The init-certs container sends a certificate signing request to the
  # kubernetes cluster.
  # You can see pending requests using: kubectl get csr
  # CSRs can be approved using:         kubectl certificate approve <csr name>
  #
  # In addition to the client certificate and key, the init-certs entrypoint will symlink
  # the cluster CA to the certs directory.
  - name: init-certs
    image: base.hatech.com.cn/cockroachdb/cockroach-k8s-request-cert:0.4
    imagePullPolicy: IfNotPresent
    command:
    - "/bin/ash"
    - "-ecx"
    - "/request-cert -namespace=${POD_NAMESPACE} -certs-dir=/cockroach-certs -type=client -user=root -symlink-ca-from=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
    env:
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    volumeMounts:
    - name: client-certs
      mountPath: /cockroach-certs
  containers:
  - name: cockroachdb-client
    image: base.hatech.com.cn/cockroachdb/cockroach:v21.1.4
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: client-certs
      mountPath: /cockroach-certs
    # Keep a pod open indefinitely so kubectl exec can be used to get a shell to it
    # and run cockroach client commands, such as cockroach sql, cockroach node status, etc.
    command:
    - sleep
    - "2147483648" # 2^31
  # This pod isn't doing anything important, so don't bother waiting to terminate it.
  terminationGracePeriodSeconds: 0
  volumes:
  - name: client-certs
    emptyDir: {}
  1. 创建资源,并查看创建情况
    • 命令方式客户端cockroachdb-client-secure创建成功
[root@master client]# kubectl apply -f 1-client-secure.yaml
pod/cockroachdb-client-secure created

[root@master client]# kubectl -n cockroachdb get pod
NAME                                           READY   STATUS      RESTARTS   AGE
cluster-init-secure-2zbvl                      0/1     Completed   0          8m34s
cockroachdb-0                                  1/1     Running     0          22m
cockroachdb-1                                  1/1     Running     0          22m
cockroachdb-2                                  1/1     Running     0          22m
cockroachdb-client-secure                      1/1     Running     0          6s
cockroachdb-nfs-provisioner-5767c7c4f5-rnsnv   1/1     Running     0          22m

八、设置用户登录信息

  1. 通过命令行客户端cockroachdb-client-securePod,进入其容器,连上cockroachdb
[root@master client]# kubectl exec -n cockroachdb -it cockroachdb-client-secure -- ./cockroach sql --certs-dir=/cockroach-certs --host=cockroachdb-public
Defaulted container "cockroachdb-client" out of: cockroachdb-client, init-certs (init)

#

# Welcome to the CockroachDB SQL shell.

# All statements must be terminated by a semicolon.

# To exit, type: \q.

#

# Server version: CockroachDB CCL v21.1.4 (x86_64-unknown-linux-gnu, built 2021/06/29 19:06:32, go1.15.11) (same version as client)

# Cluster ID: 6f8c7e65-653e-4fcb-b8c7-0270ff09200b

#

# Enter \? for a brief introduction.

#

root@cockroachdb-public:26257/defaultdb>
  1. 创建用户名密码
    • 进入cockroachdb-client-secure的额Pod链接数据库
    • 用户名称:xincan
    • 用户密码:xincan-0818
[root@master client]# kubectl exec -n cockroachdb -it cockroachdb-client-secure -- ./cockroach sql --certs-dir=/cockroach-certs --host=cockroachdb-public
Defaulted container "cockroachdb-client" out of: cockroachdb-client, init-certs (init)
#
# Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
# Server version: CockroachDB CCL v21.1.4 (x86_64-unknown-linux-gnu, built 2021/06/29 19:06:32, go1.15.11) (same version as client)
# Cluster ID: 6f8c7e65-653e-4fcb-b8c7-0270ff09200b
#
# Enter \? for a brief introduction.
#
root@cockroachdb-public:26257/defaultdb> CREATE USER xincan WITH PASSWORD 'xincan-0818';
CREATE ROLE

Time: 150ms total (execution 149ms / network 1ms)

root@cockroachdb-public:26257/defaultdb>
  1. 创建数据库,并将数据库挂载到用户下
root@cockroachdb-public:26257/defaultdb> CREATE DATABASE xincan;
CREATE DATABASE

Time: 56ms total (execution 55ms / network 1ms)

root@cockroachdb-public:26257/defaultdb> GRANT ALL ON DATABASE xincan TO xincan;
GRANT

Time: 279ms total (execution 73ms / network 206ms)

root@cockroachdb-public:26257/defaultdb>

九、界面访问

  1. 查看Service暴露端口信息
  2. 找到NodePort对应的SVC
  3. 根据IP地址加端口(31190)号进行登录
[root@master cockroachdb]# kubectl -n cockroachdb get svc
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                          AGE
cockroachdb           ClusterIP   None             <none>        26257/TCP,8080/TCP               14h
cockroachdb-public    ClusterIP   10.101.239.130   <none>        26257/TCP,8080/TCP               14h
cockroachdb-service   NodePort    10.106.168.34    <none>        26257:31191/TCP,8080:31190/TCP   14h
  1. 如图

image-20210708093124456

  1. 进入登录页面

image-20210708093209971

  1. 输入用户名:xincan, 密码:xincan-0818

image-20210708093310359

十、密钥创建

  1. 通过客户端Pod进入容器
[root@master ~]# kubectl exec -n cockroachdb -it cockroachdb-client-secure -- /bin/sh
Defaulted container "cockroachdb-client" out of: cockroachdb-client, init-certs (init)
sh-4.4# 
  1. 创建证书存放文件夹
    • certs:您将在此目录中生成 CA 证书以及所有节点和客户端证书和密钥,然后将一些文件上传到您的节点。
    • xincan-certs:您将在此目录中生成 CA 密钥,然后在生成节点和客户端证书时引用该密钥。之后,您将妥善保管密钥;您不会将其上传到您的节点。
sh-4.4# mkdir certs xincan-certs

sh-4.4# ls
bin  boot  certs  cockroach  cockroach-certs  dev  etc  home  lib  lib64  licenses  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  xincan-certs
  1. 生成 CA 证书和密钥
sh-4.4# cockroach cert create-ca --certs-dir=certs --ca-key=xincan-certs/ca.key
  1. 证书目录查看
sh-4.4# ls -l certs
total 4
-rw-r--r-- 1 root root 1151 Jul  9 05:47 ca.crt
sh-4.4# ls -l xincan-certs/
total 4
-rw------- 1 root root 1675 Jul  9 05:47 ca.key
sh-4.4#
  1. 为客户端创建证书密钥对
    • 生成证书注意
sh-4.4# cockroach cert create-client xincan --certs-dir=certs --ca-key=xincan-certs/ca.key --also-generate-pkcs8-key

sh-4.4# ls -l certs/
total 12
-rw-r--r-- 1 root root 1151 Jul  9 05:47 ca.crt
-rw-r--r-- 1 root root 1147 Jul  9 06:03 client.xincan.crt
-rw------- 1 root root 1679 Jul  9 06:03 client.xincan.key
-rw------- 1 root root 1219 Jul  9 06:03 client.xincan.key.pk8
sh-4.4#

十一、SpringBoot程序对接

  1. pom.xml增加postgresql工具依赖
<dependency>
	<groupId>org.postgresql</groupId>
	<artifactId>postgresql</artifactId>
</dependency>
  1. yml配置链接
    • 不安全链接
    • 安全链接:增加 &sslrootcert=/certs/ca.crt&sslkey=/certs/client.xincan.key.pk8&sslcert=/certs/client.xincan.crt
spring:
  application:
    name: xincan-cockroachdb
  profiles:
    active: dev

  cloud:
    nacos:
      server-addr: ${address.nacos}
      config:
        server-addr: ${spring.cloud.nacos.server-addr}
        namespace: xincan-${spring.profiles.active}-0001
        group: ${spring.profiles.active}_group
        file-extension: yaml

  datasource:
    hikari:
      driver-class-name: org.postgresql.Driver
      jdbc-url: jdbc:postgresql://192.168.1.81:31191/xincan?useSSL=true&sslmode=require&sslrootcert=certs/ca.crt&sslkey=certs/client.xincan.key.pk8&sslcert=certs/client.xincan.crt
      username: xincan
      password: xincan-0818
      connection-timeout: 30000
      minimum-idle: 5
      maximum-pool-size: 10
      idle-timeout: 30000
      max-lifetime: 30000
      auto-commit: true
      connection-test-query: SELECT 1
  1. 应用程序打包成jar之后,需要将certs文件夹copy到jar包相同目录下,不然程序找不到认证文件!!!

十二:结束语

至此集群版Kubernetes部署cockroachdb完成