本文说明如何在标准的 Kubernetes 上部署 Rancher 2.0alpha。

这些步骤目前处于 alpha/测试阶段,很可能会发生变化,截止到本文发布,Rancher 2.0正式版已经发布了。

有关此集成的原始文档可以在 https://github.com/CalvinHartwell/canonical-kubernetes-rancher/ 上找到。

Before you begin

要使用本指南,您必须拥有一个使用标准的 juju 部署的处于工作状态的 kubernetes 集群。

有关使用 juju 部署 Kubernetes 的完整说明,请访问 https://kubernetes.io/docs/getting-started-guides/ubuntu/installation/

部署 Rancher

想要部署 Rancher,我们只需要在 Kubernetes 上运行 Rancher 容器工作负载。Rancher 通过 dockerhub(https://hub.docker.com/r/rancher/server/tags/)提供他们的容器,并且可以从互联网免费下载。

如果您正在运行自己的仓库或进行离线部署,则在继续之前,应该下载容器镜像并其推入私有仓库。

使用 nodeport 部署 Rancher

首先创建一个 yaml 文件,该文件定义了如何在 kubernetes 上部署 Rancher。将该文件保存为 cdk-rancher-nodeport.yaml:

  1. ---
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: ClusterRoleBinding
  4. metadata:
  5. name: cluster-admin
  6. subjects:
  7. - kind: ServiceAccount
  8. name: default
  9. namespace: default
  10. roleRef:
  11. kind: ClusterRole
  12. name: cluster-admin
  13. apiGroup: rbac.authorization.k8s.io
  14. ---
  15. apiVersion: rbac.authorization.k8s.io/v1
  16. kind: ClusterRole
  17. metadata:
  18. name: cluster-admin
  19. rules:
  20. - apiGroups:
  21. - '*'
  22. resources:
  23. - '*'
  24. verbs:
  25. - '*'
  26. - nonResourceURLs:
  27. - '*'
  28. verbs:
  29. - '*'
  30. ---
  31. apiVersion: extensions/v1beta1
  32. kind: Deployment
  33. metadata:
  34. creationTimestamp: null
  35. labels:
  36. app: rancher
  37. name: rancher
  38. spec:
  39. replicas: 1
  40. selector:
  41. matchLabels:
  42. app: rancher
  43. strategy: {}
  44. template:
  45. metadata:
  46. creationTimestamp: null
  47. labels:
  48. app: rancher
  49. ima: pod
  50. spec:
  51. containers:
  52. - image: rancher/server:preview
  53. imagePullPolicy: Always
  54. name: rancher
  55. ports:
  56. - containerPort: 80
  57. - containerPort: 443
  58. livenessProbe:
  59. httpGet:
  60. path: /
  61. port: 80
  62. initialDelaySeconds: 5
  63. timeoutSeconds: 30
  64. resources: {}
  65. restartPolicy: Always
  66. serviceAccountName: ""
  67. status: {}
  68. ---
  69. apiVersion: v1
  70. kind: Service
  71. metadata:
  72. name: rancher
  73. labels:
  74. app: rancher
  75. spec:
  76. ports:
  77. - port: 443
  78. protocol: TCP
  79. targetPort: 443
  80. selector:
  81. app: rancher
  82. ---
  83. apiVersion: v1
  84. kind: Service
  85. metadata:
  86. name: rancher-nodeport
  87. spec:
  88. type: NodePort
  89. selector:
  90. app: rancher
  91. ports:
  92. - name: rancher-api
  93. protocol: TCP
  94. nodePort: 30443
  95. port: 443
  96. targetPort: 443

一旦 kubectl 运行并处于工作状态,运行以下命令来部署 Rancher:

  1. kubectl apply -f cdk-rancher-nodeport.yaml

现在我们需要打开这个 nodeport,以便我们可以访问它。为此,我们可以使用 juju。我们需要为集群中的每个工作节点运行 open-port 命令。在 cdk-rancher-nodeport.yaml 文件中,nodeport 已设置为 30443。下面显示了如何在每个工作节点上打开端口:

  1. # 对集群中的每个 Kubernetes 工作节点重复此操作。
  2. juju run --unit kubernetes-worker/0 "open-port 30443"
  3. juju run --unit kubernetes-worker/1 "open-port 30443"
  4. juju run --unit kubernetes-worker/2 "open-port 30443"

现在可以通过工作节点 IP 或 DNS 条目在此端口上访问 Rancher(如果已创建它们)。通常建议您为集群中的每个工作节点创建一个 DNS 条目。例如,如果您有三个工作节点并且您拥有域 example.com,则可以创建三条 A 记录,每个集群中的每个工作节点都有一条记录。

由于创建 DNS 条目超出了本文的范围,因此我们将使用可免费获得的 xip.io 服务,该服务可返回 A 记录作为域名一部分的 IP 地址。例如,如果您有域 rancher.35.178.130.245.xip.io,则 xip.io 服务将自动将 IP 地址 35.178.130.245 作为 A 记录返回,这对于测试目的很有用。对于您的部署,IP 地址 35.178.130.245 应该替换为您的一个工作节点 IP 地址,您可以使用 Juju 或 AWS 找到该 IP 地址:

  1. calvinh@ubuntu-ws:~/Source/cdk-rancher$ juju status
  2.  
  3. # ... 输出省略.
  4.  
  5. Unit Workload Agent Machine Public address Ports Message
  6. easyrsa/0* active idle 0 35.178.118.232 Certificate Authority connected.
  7. etcd/0* active idle 1 35.178.49.31 2379/tcp Healthy with 3 known peers
  8. etcd/1 active idle 2 35.177.99.171 2379/tcp Healthy with 3 known peers
  9. etcd/2 active idle 3 35.178.125.161 2379/tcp Healthy with 3 known peers
  10. kubeapi-load-balancer/0* active idle 4 35.178.37.87 443/tcp Loadbalancer ready.
  11. kubernetes-master/0* active idle 5 35.177.239.237 6443/tcp Kubernetes master running.
  12. flannel/0* active idle 35.177.239.237 Flannel subnet 10.1.27.1/24
  13. kubernetes-worker/0* active idle 6 35.178.130.245 80/tcp,443/tcp,30443/tcp Kubernetes worker running.
  14. flannel/2 active idle 35.178.130.245 Flannel subnet 10.1.82.1/24
  15. kubernetes-worker/1 active idle 7 35.178.121.29 80/tcp,443/tcp,30443/tcp Kubernetes worker running.
  16. flannel/3 active idle 35.178.121.29 Flannel subnet 10.1.66.1/24
  17. kubernetes-worker/2 active idle 8 35.177.144.76 80/tcp,443/tcp,30443/tcp Kubernetes worker running.
  18. flannel/1 active idle 35.177.144.76
  19.  
  20. # 注意上面例子中 kubernetes 工作节点的 IP 地址。您应该选择一个公网地址。

尝试使用 nodeport 和域名或 IP 地址在浏览器中打开 Rancher:

  1. # 将 IP 地址替换为您的 Kubernetes 工作节点之一,从 juju 状态命令中找到此地址。
  2. wget https://35.178.130.245.xip.io:30443 --no-check-certificate
  3.  
  4. # 这应该也可以工作
  5. wget https://35.178.130.245:30443 --no-check-certificate

如果您需要对 kubernetes 配置文件进行任何更改,请编辑 yaml 文件,然后再次使用 apply:

  1. kubectl apply -f cdk-rancher-nodeport.yaml

使用 ingress 规则部署 Rancher

也可以使用 ingress 规则来部署 Rancher。这还有另外一个好处,就是不需要在 Kubernetes 集群上打开额外的端口。首先创建一个 yaml 文件来描述名为 cdk-rancher-ingress.yaml 的部署,它应包含以下内容:

  1. ---
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: ClusterRoleBinding
  4. metadata:
  5. name: cluster-admin
  6. subjects:
  7. - kind: ServiceAccount
  8. name: default
  9. namespace: default
  10. roleRef:
  11. kind: ClusterRole
  12. name: cluster-admin
  13. apiGroup: rbac.authorization.k8s.io
  14. ---
  15. apiVersion: rbac.authorization.k8s.io/v1
  16. kind: ClusterRole
  17. metadata:
  18. name: cluster-admin
  19. rules:
  20. - apiGroups:
  21. - '*'
  22. resources:
  23. - '*'
  24. verbs:
  25. - '*'
  26. - nonResourceURLs:
  27. - '*'
  28. verbs:
  29. - '*'
  30. ---
  31. apiVersion: extensions/v1beta1
  32. kind: Deployment
  33. metadata:
  34. creationTimestamp: null
  35. labels:
  36. app: rancher
  37. name: rancher
  38. spec:
  39. replicas: 1
  40. selector:
  41. matchLabels:
  42. app: rancher
  43. strategy: {}
  44. template:
  45. metadata:
  46. creationTimestamp: null
  47. labels:
  48. app: rancher
  49. spec:
  50. containers:
  51. - image: rancher/server:preview
  52. imagePullPolicy: Always
  53. name: rancher
  54. ports:
  55. - containerPort: 443
  56. livenessProbe:
  57. httpGet:
  58. path: /
  59. port: 80
  60. initialDelaySeconds: 5
  61. timeoutSeconds: 30
  62. resources: {}
  63. restartPolicy: Always
  64. serviceAccountName: ""
  65. status: {}
  66. ---
  67. apiVersion: v1
  68. kind: Service
  69. metadata:
  70. name: rancher
  71. labels:
  72. app: rancher
  73. spec:
  74. ports:
  75. - port: 443
  76. targetPort: 443
  77. protocol: TCP
  78. selector:
  79. app: rancher
  80. ---
  81. apiVersion: extensions/v1beta1
  82. kind: Ingress
  83. metadata:
  84. name: rancher
  85. annotations:
  86. kubernetes.io/tls-acme: "true"
  87. ingress.kubernetes.io/secure-backends: "true"
  88. spec:
  89. tls:
  90. - hosts:
  91. - rancher.34.244.118.135.xip.io
  92. rules:
  93. - host: rancher.34.244.118.135.xip.io
  94. http:
  95. paths:
  96. - path: /
  97. backend:
  98. serviceName: rancher
  99. servicePort: 443

通常建议您为集群中的每个工作节点创建一个 DNS 条目。例如,如果您有三个工作节点并且您拥有域 example.com,则可以创建三条 A 记录,每个集群中的每个工作人员都有一条记录。

由于创建 DNS 条目超出了本教程的范围,因此我们将使用可免费获得的 xip.io 服务,该服务可以返回 A 记录作为域名一部分的 IP 地址。例如,如果您有域 rancher.35.178.130.245.xip.io,则 xip.io 服务将自动将 IP 地址 35.178.130.245 作为 A 记录返回,这对于测试目的很有用。

对于您的部署,IP 地址 35.178.130.245 应该替换为您的一个工作节点 IP 地址,您可以使用 Juju 或 AWS 找到该 IP 地址:

  1. calvinh@ubuntu-ws:~/Source/cdk-rancher$ juju status
  2.  
  3. # ... 输出省略。
  4.  
  5. Unit Workload Agent Machine Public address Ports Message
  6. easyrsa/0* active idle 0 35.178.118.232 Certificate Authority connected.
  7. etcd/0* active idle 1 35.178.49.31 2379/tcp Healthy with 3 known peers
  8. etcd/1 active idle 2 35.177.99.171 2379/tcp Healthy with 3 known peers
  9. etcd/2 active idle 3 35.178.125.161 2379/tcp Healthy with 3 known peers
  10. kubeapi-load-balancer/0* active idle 4 35.178.37.87 443/tcp Loadbalancer ready.
  11. kubernetes-master/0* active idle 5 35.177.239.237 6443/tcp Kubernetes master running.
  12. flannel/0* active idle 35.177.239.237 Flannel subnet 10.1.27.1/24
  13. kubernetes-worker/0* active idle 6 35.178.130.245 80/tcp,443/tcp,30443/tcp Kubernetes worker running.
  14. flannel/2 active idle 35.178.130.245 Flannel subnet 10.1.82.1/24
  15. kubernetes-worker/1 active idle 7 35.178.121.29 80/tcp,443/tcp,30443/tcp Kubernetes worker running.
  16. flannel/3 active idle 35.178.121.29 Flannel subnet 10.1.66.1/24
  17. kubernetes-worker/2 active idle 8 35.177.144.76 80/tcp,443/tcp,30443/tcp Kubernetes worker running.
  18. flannel/1 active idle 35.177.144.76
  19.  
  20. # 注意上面例子中 kubernetes 工作节点的 IP 地址。您应该选择一个公网地址。

查看上述 juju 状态的输出,公共地址(35.178.130.245)可用于创建 xip.io DNS 条目(rancher.35.178.130.245.xip.io),该条目应放置在 cdk-rancher- ingress.yaml 文件。您也可以创建自己的 DNS 条目,只要它解析为每个工作节点或其中一个工作节点即可正常工作:

  1. # 文件中,xip.io 域应该出现在两个地方,都需要修改
  2. cat cdk-rancher-ingress.yaml | grep xip.io
  3. - host: rancher.35.178.130.245.xip.io

一旦编辑了 ingress 规则以映射您的 DNS 条目,请运行 kubectl apply -f cdk-rancher-ingress.yaml 来部署 Kubernetes:

  1. kubectl apply -f cdk-rancher-ingress.yaml

现在可以通过工作节点 IP 或 DNS 条目在常规 443 上访问 Rancher(如果已创建它们)。尝试在浏览器中打开它:

  1. # 将 IP 地址替换为您的 Kubernetes 工作节点之一,从 juju 状态命令中找到此地址。
  2. wget https://35.178.130.245.xip.io:443 --no-check-certificate

如果您需要对 kubernetes 配置文件进行任何更改,请编辑 yaml 文件,然后再次使用 apply:

  1. kubectl apply -f cdk-rancher-ingress.yaml

移除 Rancher

您可以使用 kubectl 从集群中删除 Rancher。在 Kubernetes 中删除结构与创建它们一样简单:

  1. # 使用 nodeport 示例(如果使用 ingress 示例,请修改文件名)
  2. kubectl delete -f cdk-rancher-nodeport.yaml

译者:chentao1596 / 原文链接

K8S中文社区微信公众号

原文: http://docs.kubernetes.org.cn/828.html