美文网首页
kubernetes之pod选举

kubernetes之pod选举

作者: davisgao | 来源:发表于2018-11-27 11:45 被阅读0次

1.背景

在实际应用中一组pod中统一时间内只有一个active节点,其他的节点为standby状态。即需要进行选主操作。来对于外暴露主节点的的IP。

我们知道,非容器化的的一些节点的选主需要借助于其他组件比如zookeeper,consul,etcd等,那容器的应用在集群内部没有可用的组件(除非单独在创建),本次所介绍的方法,本质上是通过kube-apiserver实现,其实变相的是借助集群的存储(etcd),为了减少对应用本省的改造,降低对应用本省的侵入性,采用sidecars模式(在lstio等微服务中使用的很常见)。

在正常情况kubernetes中的deployment通过service暴露节点是,会吧endpointsz下的所有节点地址都暴露。如下:

[root@host229 yaml]# kubectl get ep,svc
NAME                            ENDPOINTS                                                  AGE
endpoints/tomcat                192.168.0.2:8080,192.168.1.2:8080,192.168.2.3:8080         19d

NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/tomcat          ClusterIP   10.254.209.95    <none>        80/TCP           19d
[root@host229 yaml]# kubectl describe service/tomcat
Name:              tomcat
Namespace:         default
Labels:            run=tomcat
Annotations:       <none>
Selector:          run=tomcat
Type:              ClusterIP
IP:                10.254.209.95
Port:              <unset>  80/TCP
TargetPort:        8080/TCP
Endpoints:         192.168.0.2:8080,192.168.1.2:8080,192.168.2.3:8080
Session Affinity:  None
Events:            <none>

其实本次用的组件leader-elector,本质上是通过与kube-apiserver直接交互,然后在程序内部控制endpoint的生成,使选出的主节点的地址写在endpoint。

交互图如下:


leader-elector.png

2.实战

编写yaml文件

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: leader-elector
spec:
  replicas: 3
  template:
    metadata:
      labels:
        run: leader-elector
    spec:
      serviceAccountName: leader-elector-sa
      serviceAccount: leader-elector-sa
      containers:
      - image: tomcat
        name: tomcat
      - image: gcr.io/google_containers/leader-elector:0.4
        name: leader-elector
        args:
        - --election=example  //endpoint的名称
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: leader-elector-sa
  namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: leader-elector-cr
  namespace: default
rules:
  - apiGroups:
    - ""
  //需要用到的资源对象
    resources:
      - namespaces
      - endpoints
  //需要用到的动作权限
    verbs:
      - list
      - get
      - watch
      - create
      - update
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: leader-elector-crb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: leader-elector-cr
subjects:
- kind: ServiceAccount
  name: leader-elector-sa
  namespace: default
[root@host229 yaml]# kubectl apply -f leader-elector.yaml 
deployment.extensions/leader-elector created
serviceaccount/leader-elector-sa created
clusterrole.rbac.authorization.k8s.io/leader-elector-cr created
clusterrolebinding.rbac.authorization.k8s.io/leader-elector-crb created
[root@host229 yaml]# kubectl get pod
leader-elector-75fdcf4f46-2bdq6   2/2       Running   0          3m        192.168.2.16   host227
leader-elector-75fdcf4f46-4l84s   2/2       Running   0          3m        192.168.1.11   host228
leader-elector-75fdcf4f46-kmr9w   2/2       Running   0          3m        192.168.3.14   host214
//查看主节点
[root@host229 yaml]# kubectl logs deployment.apps/leader-elector leader-elector
Found 3 pods, using pod/leader-elector-75fdcf4f46-kmr9w
 is the leader
leader-elector-75fdcf4f46-kmr9w is the leader
I1127 02:32:37.867264       9 leaderelection.go:180] sucessfully acquired lease default/example
[root@host229 yaml]# kubectl get ep
NAME                  ENDPOINTS                                                  AGE
example               192.168.3.14                                                    4m

相关文章

网友评论

      本文标题:kubernetes之pod选举

      本文链接:https://www.haomeiwen.com/subject/psiwqqtx.html