如何在OpenStack云顶部的Kubernetes集群中部署和配置octavia-ingress-controller

什么是Ingress控制器?

在Kubernetes中,Ingress允许外部用户和客户端应用程序访问HTTP服务。Ingress由两个组件组成。

  • 入口资源是入站流量到达服务的一组规则。这些是第7层(L7)规则,允许将主机名(和可选路径)定向到Kubernetes中的特定服务。
  • Ingress Controller根据入口资源设置的规则进行操作,通常通过HTTP或L7负载均衡器进行操作。

正确配置这两个组件以将流量从外部客户端路由到Kubernetes服务至关重要。

为什么八度入口控制器

作为基于OpenStack的公共云提供商,Catalyst Cloud的目标之一就是通过提供强大而全面的云服务,不断为客户提供创新能力。在公共云中部署Octavia和Magnum服务后,我们正在考虑如何帮助客户开发在Kubernetes群集上运行的应用程序,并以高性能方式向公众提供服务。

在Magnum中创建Kubernetes集群后,将应用程序公开到外部世界的最常见方式是使用LoadBalancer类型服务。在OpenStack云中,Octavia(LBaaS v2)是LoadBalancer类型服务的默认实现,因此,对于每个LoadBalancer类型服务,都会在云租户帐户中创建负载平衡器。这种方法有一些缺点:

  • 如果从服务到Octavia负载平衡器进行一对一映射,客户必须为每个暴露服务负载均衡器付费,这会导致Kubernetes服务的成本稍高。
  • 该服务没有过滤,没有路由等。这意味着你可以发送几乎任何类型的流量给它,比如HTTP,TCP,UDP,Websockets,gRPC或其他。
  • 诸如NGINX入口控制器,HAProxy入口控制器,Træfik等传统的入口控制器在云环境中没有多大意义,因为用户仍然需要为入口控制器本身提供服务,这可能增加网络延迟并减少应用程序的性能。

Octavia入口控制器可以通过在Ingress中为多个NodePort类型服务创建单个负载均衡器来解决OpenStack环境中的所有上述问题。为了在Kubernetes集群中使用octavia-ingress-controller,请使用入口资源的元数据部分中的openstack注释值,kubernetes.io/ingress.class如下所示:

annotations: kubernetes.io/ingress.class: openstack

如何部署octavia-ingress-controller

准备kubeconfig文件

kubeconfig文件用于配置对Kubernetes集群的访问。这是在Kubernetes中引用配置文件的通用方式。以下命令在使用kubeadm创建的Kubernetes集群中执行。

  • 安装用于生成TLS证书的cfssl工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 && chmod +x cfssl_linux-amd64 && mv cfssl_linux-amd64 /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 && chmod +x cfssljson_linux-amd64 && mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 && chmod +x cfssl-certinfo_linux-amd64 && mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
  • 在现有群集中重新使用CA证书和密钥
pushd /etc/kubernetes/pki
cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}
EOF
cat > ingress-openstack-csr.json <<EOF
{
  "CN": "octavia-ingress-controller",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "NZ",
      "ST": "Wellington",
      "L": "Wellington",
      "O": "Catalyst",
      "OU": "Lingxian"
    }
  ]
}
EOF
cfssl gencert -ca=ca.crt -ca-key=ca.key -config=ca-config.json -profile=kubernetes ingress-openstack-csr.json | cfssljson -bare ingress-openstack
# You can take a look at the files generated by cfssl
ls -l | grep ingress-openstack
  • 为octavia-ingress-controller创建kubeconfig文件
ca_data=$(cat ca.crt | base64 | tr -d '\n')
client_cert_data=$(cat ingress-openstack.pem | base64 | tr -d '\n')
client_key_data=$(cat ingress-openstack-key.pem | base64 | tr -d '\n')
cat <<EOF > /etc/kubernetes/ingress-openstack.conf
apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: ${ca_data}
    server: https://${k8s_master_ip}:6443
  name: kubernetes
preferences: {}
users:
- name: octavia-ingress-controller
  user:
    client-certificate-data: ${client_cert_data}
    client-key-data: ${client_key_data}
contexts:
- context:
    cluster: kubernetes
    user: octavia-ingress-controller
  name: octavia-ingress-controller@kubernetes
current-context: octavia-ingress-controller@kubernetes
EOF
popd

为octavia-ingress-controller用户配置RBAC

为了进行测试,请cluster-adminoctavia-ingress-controller用户授予角色,以便用户可以完全访问Kubernetes群集。

cat <<EOF | kc create -f -
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: octavia-ingress-controller
subjects:
  - kind: User
    name: octavia-ingress-controller
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
EOF

准备octavia-ingress-controller服务配置

我们需要管理员用户的证书以及OpenStack中的普通用户(例如演示)。

source openrc_admin
project_id=$(openstack project show demo -c id -f value)
auth_url=$(export | grep OS_AUTH_URL | awk -F'"' '{print $2}')
subnet_id=$(openstack subnet show private-subnet -c id -f value)
public_net_id=$(openstack network show public -c id -f value)
cat <<EOF > /etc/kubernetes/ingress-openstack.yaml
kubernetes:
    kubeconfig: /etc/kubernetes/ingress-openstack.conf
openstack:
    username: demo
    password: password
    project_id: ${project_id}
    auth_url: ${auth_url}/v3
    region: RegionOne
octavia:
    subnet_id: ${subnet_id}
    fip_network: ${public_net_id}
EOF

设置octavia-ingress-controller服务

cat <<EOF > /etc/kubernetes/manifests/octavia-ingress-controller.yaml
---
apiVersion: v1
kind: Pod
metadata:
  annotations:
    scheduler.alpha.kubernetes.io/critical-pod: ""
  labels:
    component: octavia-ingress-controller
    tier: control-plane
  name: octavia-ingress-controller
  namespace: kube-system
spec:
  containers:
    - name: octavia-ingress-controller
      image: lingxiankong/openstack-ingress-controller:0.0.2
      imagePullPolicy: Always
      args:
        - /bin/octavia-ingress-controller
        - --config=/etc/kubernetes/ingress-openstack.yaml
      volumeMounts:
      - mountPath: /etc/kubernetes/ingress-openstack.yaml
        name: ingressconfig
        readOnly: true
      - mountPath: /etc/kubernetes/ingress-openstack.conf
        name: kubeconfig
        readOnly: true
      resources:
        requests:
          cpu: 200m
  hostNetwork: true
  volumes:
  - hostPath:
      path: /etc/kubernetes/ingress-openstack.yaml
      type: FileOrCreate
    name: ingressconfig
  - hostPath:
      path: /etc/kubernetes/ingress-openstack.conf
      type: FileOrCreate
    name: kubeconfig
status: {}
EOF

等到octavia-ingress-controller静态吊舱启动并运行。

$ kubectl get pod --all-namespaces | grep octavia-ingress-controller
kube-system   octavia-ingress-controller-lingxian-k8s-master   1/1       Running   0          1m

使用Ingress设置HTTP负载平衡

创建一个后端服务

创建一个在端口8080上的HTTP服务器上侦听的简单服务(echo hostname)。

$ cat <<EOF | kc create -f -
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hostname-echo-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hostname-echo
  template:
    metadata:
      labels:
        app: hostname-echo
    spec:
      containers:
        - image: "lingxiankong/alpine-test"
          imagePullPolicy: Always
          name: hostname-echo-container
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: hostname-echo-svc
spec:
  ports:
     -  port: 8080
        protocol: TCP
        targetPort: 8080
  selector:
    app: hostname-echo
  type: NodePort
EOF
$ kubectl get svc
NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
hostname-echo-svc   NodePort    10.106.36.88   <none>        8080:32066/TCP   33s

当您创建一个类型为NodePort的服务时,Kubernetes使您的服务在群集中所有节点上随机选择的高端口号(例如32066)上可用。通常,默认情况下,Kubernetes节点不是外部可访问的,创建此服务不会使您的应用程序可从Internet访问。但是,我们可以使用其CLUSTER-IP在Kubernetes主节点上验证服务:

$ curl http://10.106.36.88:8080
hostname-echo-deployment-698fd44fc8-jptl2

为了让您的HTTP Web服务器应用程序可公开访问,您需要创建一个Ingress资源。

创建一个Ingress资源

下面命令定义指导请求流量的入口资源http://api.sample.com/hostnamehostname-echo服务:

cat <<EOF | kc create -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-octavia-ingress
  annotations:
    kubernetes.io/ingress.class: "openstack"
spec:
  rules:
  - host: api.sample.com
    http:
      paths:
      - path: /hostname
        backend:
          serviceName: hostname-echo-svc
          servicePort: 8080
EOF

Kubernetes在您的群集上创建一个Ingress资源。在群集中运行的octavia-ingress-controller服务负责在Octavia中创建/维护相应的资源,以将所有外部HTTP流量(在端口80上)路由到hostname-echo您公开的NodePort服务。

验证是否已创建入口资源。请注意,入口资源的IP地址将不会立即定义(稍等片刻即可填充ADDRESS字段):

$ kubectl get ing
NAME                   HOSTS            ADDRESS   PORTS     AGE
test-octavia-ingress   api.sample.com             80        12s
$ # Wait until the ingress gets an IP address
$ kubectl get ing
NAME                   HOSTS            ADDRESS      PORTS     AGE
test-octavia-ingress   api.sample.com   172.24.4.9   80        9m

出于测试目的,您可以登录到与OpenStack云网络连接的主机,您需要更新/etc/hosts主机中的文件以解析api.sample.com为Ingress IP地址,然后您应该能够通过发送HTTP请求来访问后端服务入口资源中指定的域名:

$ echo "172.24.4.9 api.sample.com" >> /etc/hosts
$ curl http://api.sample.com/hostname
hostname-echo-deployment-698fd44fc8-jptl2

未经允许不得转载:技术啦-分享最新技术教程,最新资源 » 如何在OpenStack云顶部的Kubernetes集群中部署和配置octavia-ingress-controller

赞 (0) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址