【问题标题】:kubernetes create a service with domain at the endkubernetes 在最后创建一个带域的服务
【发布时间】:2019-01-01 19:44:46
【问题描述】:

我在 AWS 中使用 kops 创建了一个 gossip 集群,这意味着我的集群名称以 k8s.local 结尾(clusters.test.k8s.local 待执行) , 一切正常,直到我尝试创建一个部署,其中 pod 名称需要以域结尾 (api-manager.iot.test.co.nz)。

我知道创建不符合此正则表达式要求的 Pod 是无权的:

'[a-z]([-a-z0-9]*[a-z0-9])?'

有什么办法可以做到吗?

我尝试在 template->spec 下添加主机名,但它具有相同的限制(正则表达式)。

这是我的部署 YAML 文件:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  labels:
  name: api-manager
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: api-manager
    spec:
      volumes:
       - name: api-manager-efs
         persistentVolumeClaim:
          claimName: pvc-apim
      containers:
      - image: api-manager:2.1.0
        name: api-manager.iot.test.co.nz
        ports:
        - name: porta 
          containerPort: 9763
        - name: portb
          containerPort: 9443         
        env:
        - name: SLEEP
          value: "30"

        volumeMounts:
        - name: api-manager-efs
          mountPath: /home/wso2carbon/wso2am-2.1.0/repository 

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    不,你不能通过设计创建那种labels

    来自设计document

    rfc1035/rfc1123 label (DNS_LABEL):一个字母数字(a-z 和 0-9)字符串,最大长度为 63 个字符,除了第一个或最后一个之外的任何位置都允许使用“-”字符字符,适合用作域名中的主机名或段。

    这是当前的implementation

    const dns1035LabelFmt string = "[a-z]([-a-z0-9]*[a-z0-9])?"
    const dns1035LabelErrMsg string = "a DNS-1035 label must consist of lower case alphanumeric characters or '-', start with an alphabetic character, and end with an alphanumeric character"
    const DNS1035LabelMaxLength int = 63
    
    var dns1035LabelRegexp = regexp.MustCompile("^" + dns1035LabelFmt + "$")
    
    // IsDNS1035Label tests for a string that conforms to the definition of a label in
    // DNS (RFC 1035).
    func IsDNS1035Label(value string) []string {
        var errs []string
        if len(value) > DNS1035LabelMaxLength {
            errs = append(errs, MaxLenError(DNS1035LabelMaxLength))
        }
        if !dns1035LabelRegexp.MatchString(value) {
            errs = append(errs, RegexError(dns1035LabelErrMsg, dns1035LabelFmt,     "my-name", "abc-123"))
        }
        return errs
    }
    

    【讨论】:

    【解决方案2】:

    历经千辛万苦, 这是我的解决方案:

    https://kubernetes.io/blog/2017/04/configuring-private-dns-zones-upstream-nameservers-kubernetes/

    1.) 使用您的域配置创建一个 dnsmasq,您必须附加一个集群 IP,该 IP 必须在您使用的 k8s 集群范围内。

    这些是我为此创建的 yaml 文件:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: dnsmasq
      labels:
        app: dnsmasq
    data:
      dnsmasq.conf: |+
        user=root
        #dnsmasq config, for a complete example, see:
        #  http://oss.segetech.com/intra/srv/dnsmasq.conf
        #log all dns queries
        log-queries
        #dont use hosts nameservers
        no-resolv
        #use google as default nameservers
        server=8.8.4.4
        server=8.8.8.8
        #serve all .company queries using a specific nameserver
        server=/company/10.0.0.1
        #explicitly define host-ip mappings
        address=/api-manager.iot.test.vector.co.nz/100.64.53.55
    
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: dnsmasq
      name: dnsstub
    spec:
      type: "{{.Values.Service.serviceType}}"
      clusterIP: 100.68.140.187
      ports:
       - port: {{ .Values.Service.serviceports.port }}
         protocol: UDP
      selector:
        app: dnsmasq
    
    
    ---
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: dnsmasq
    spec:
      replicas: {{ .Values.Deployment.replicaCount }}
      template:
        metadata:
          labels:
            app: dnsmasq
        spec:
          containers:
          - name: dnsmasq
            image:  dnsmasq:1.0.2
            ports:
               - containerPort: {{ .Values.Deployment.ports.containerport }}
                 protocol: UDP
            volumeMounts:
            - name: etc
              mountPath: /etc/dnsmasq.conf
              subPath: dnsmasq.conf
          imagePullSecrets:
            - name: mprestg-credentials
          volumes:
          - name: etc
            configMap:
              name: dnsmasq
          dnsPolicy: Default
    

    2.) 使用 stubDomain 创建一个 kube-dns 配置映射:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: kube-dns
      namespace: kube-system
    data:
      stubDomains: |
        {"iot.test.vector.co.nz": ["100.68.140.187"]}
    

    3.) 将我们在 dns 配置中定义的静态 IP 添加到 out 服务:

    apiVersion: v1
    kind: Service
    metadata:
      name: api-manager
      labels:
        app: api-manager
        tier: apim
    spec:
      ports:
      - port: 9763
        name: porta
        targetPort: 9763
    
      selector:
        app: api-manager
      type: LoadBalancer
      clusterIP: 100.64.53.55
    

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 2022-12-18
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 2022-01-14
      • 2018-06-18
      相关资源
      最近更新 更多