前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二进制安装k8s集群(14)-安装coredns

二进制安装k8s集群(14)-安装coredns

作者头像
TA码字
发布2020-04-01 11:39:05
1.2K0
发布2020-04-01 11:39:05
举报
文章被收录于专栏:TA码字TA码字

上一篇文章里我们主要介绍worker组件kube-proxy的安装,这里我们开始介绍安装k8s集群内的一些基础服务,所有的基础服务都创建在kube-system这个namesapce里,我们从coredns开始。coredns提供k8s集群内部service的fqdn服务,是以deployment的方式运行在k8s集群内部的。image镜像从我们的private repo pull下来(以前文章里介绍过harbor private repo的创建,以及镜像的push和pull)。当然原始image来源于官方的k8s.gcr.io/coredns:1.3.1,不过要下载它需要访问国外网站。

创建配置文件目录:

由于coredns是以deployment的方式部署在k8s集群里的,一般都会有yaml部署文件,目前都放在此目录里。

代码语言:javascript
复制
mkdir -p /opt/application/k8s/core-dns
cd /opt/application/k8s/core-dns

创建image pull secret:

由于我们使用的是private repo的private project里的image,所以k8s在pull image的时候需要repo的认证,这个认证信息就存储在k8s secret资源里。

代码语言:javascript
复制
kubectl create secret docker-registry container-registry --docker-server=172.20.11.41:1034 \
--docker-username=admin --docker-password=abc123_ --namespace=kube-system

kubectl describe secret container-registry -n kube-system

创建coredns的service-account:

将上个步骤创建的secret赋给这个service-account,另外coredns需要访问kube-apiserver来得到service name和cluster ip,从而建立fqdn服务。对于资源访问,k8s有自己的策略,这里给coredns创建单独的service-account,cluster-role,cluster-role-binding。这里就不详细展开,有兴趣的同学可以看一下k8s的RBAC访问策略。

代码语言:javascript
复制
cat > /opt/application/k8s/core-dns/coredns-service-account.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: serviceaccount-coredns
  namespace: kube-system
imagePullSecrets:
- name: container-registry
EOF

kubectl create -f /opt/application/k8s/core-dns/coredns-service-account.yaml 
kubectl describe serviceaccount serviceaccount-coredns -n kube-system

创建coredns的cluster-role:

代码语言:javascript
复制
cat > /opt/application/k8s/core-dns/coredns-cluster-role.yaml <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-role-coredns
rules:
- apiGroups:
  - ""
  resources:
  - endpoints
  - services
  - pods
  - namespaces
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
EOF

kubectl create -f /opt/application/k8s/core-dns/coredns-cluster-role.yaml
kubectl describe clusterrole cluster-role-coredns

创建coredns的cluster-role-binding:

代码语言:javascript
复制
cat > /opt/application/k8s/core-dns/coredns-cluster-role-binding.yaml <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-role-binding-coredns
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-role-coredns
subjects:
- kind: ServiceAccount
  name: serviceaccount-coredns
  namespace: kube-system
EOF

kubectl create -f /opt/application/k8s/core-dns/coredns-cluster-role-binding.yaml
kubectl describe clusterrolebinding cluster-role-binding-coredns -n kube-system

创建coredns的配置configmap:

coredns也有自己的配置,我们把它的配置创建在k8s configmap资源里,然后在容器里挂载这个configmap的数据,从而提供给coredns配置。当然配置项比较多,这里就不逐一介绍,有兴趣的同学请参考coredns的配置文档。

代码语言:javascript
复制
cat > /opt/application/k8s/core-dns/coredns-config-map.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local {
            endpoint https://172.20.11.41:6443
            tls /etc/coredns/k8scert/k8sapiserver-client.crt /etc/coredns/k8scert/k8sapiserver-client.key /etc/coredns/k8scert/ca.crt
            pods insecure
            upstream
            fallthrough cluster.local
            ttl 30
        }
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
EOF

kubectl create -f /opt/application/k8s/core-dns/coredns-config-map.yaml
kubectl describe configmap configmap-coredns -n kube-system

创建coredns的配置secret :

coredns是需要与kube-apiserver交互的,我们的kube-apiserver开启了ssl验证,所以在coredns里也要配置相应的证书,这个请提前制作好(可以参考以前文章制作docker server证书)。对于k8s来说ssl证书可以存储在secret对象里(和configmap相比只是把原文本base64了一下),然后挂载到容器中,给coredns提供配置。

代码语言:javascript
复制
kubectl create secret generic core-dns-k8s-access-secret --namespace=kube-system \
--from-file=k8sapiserver-client.key=/opt/sw/cert/k8sapiserver-client.key \
--from-file=k8sapiserver-client.crt=/opt/sw/cert/k8sapiserver-client.crt \
--from-file=ca.crt=/opt/sw/cert/ca.crt

kubectl describe secret core-dns-k8s-access-secret -n kube-system

创建coredns的deployment:

代码语言:javascript
复制
cat > /opt/application/k8s/core-dns/coredns-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-coredns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  selector:
    matchLabels:
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        k8s-app: kube-dns
    spec:
      serviceAccountName: serviceaccount-coredns
      containers:
      - name: coredns
        image: 172.20.11.41:1034/infra/coredns:latest
        imagePullPolicy: IfNotPresent
        args: [ "-conf", "/etc/coredns/Corefile" ]
        volumeMounts:
        - name: config-volume
          mountPath: /etc/coredns
          readOnly: true
        - name: config-volume-k8s-cert
          mountPath: /etc/coredns/k8scert
          readOnly: true
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
        - containerPort: 9153
          name: metrics
          protocol: TCP
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
            scheme: HTTP
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            add:
            - NET_BIND_SERVICE
            drop:
            - all
          readOnlyRootFilesystem: true
      dnsPolicy: Default
      volumes:
        - name: config-volume
          configMap:
            name: configmap-coredns
            items:
            - key: Corefile
              path: Corefile
        - name: config-volume-k8s-cert
          secret:
            secretName: core-dns-k8s-access-secret
EOF

kubectl create -f /opt/application/k8s/core-dns/coredns-deployment.yaml
kubectl describe deployment deployment-coredns -n kube-system

创建coredns的service:

这个service会生成coredns在集群里的cluster-ip,这个cluster-ip在kubetel里配置,然后在kubelet创建容器的时候将这个ip配置为容器的dns服务器地址。所以请在配置文件的clusterIP字段里设置value和以前文章中kubelet的--cluster-dns配置项一致。

代码语言:javascript
复制
cat > /opt/application/k8s/core-dns/coredns-service.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: service-core-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 10.254.10.2
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP
  - name: metrics
    port: 9153
    protocol: TCP
EOF

kubectl create -f /opt/application/k8s/core-dns/coredns-service.yaml 
kubectl describe service service-core-dns -n kube-system

查看coredns在集群中的pod:

代码语言:javascript
复制
kubectl get pods -n kube-system
kubectl logs deployment-coredns-c58b8b7fc-kp2j8   -n kube-system
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TA码字 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档