备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
专栏首页 哎_小羊 Kubernetes 集群使用 Helm 搭建 GitLab 并配置 Ingress
1 1

海报分享

Kubernetes 集群使用 Helm 搭建 GitLab 并配置 Ingress

目录

1、Helm 介绍

Helm 是一个管理 Kubernetes Charts 的工具,Charts 可以理解为预先配置的 Kubernetes 资源包,通过 Helm 可以轻松的安装和管理 Kubernetes 应用,类似我们平时使用的 apt、yum、homebrew 工具。Helm 包含两部分:客户端 Helm 和服务端 Tiller,服务端 Tiller 运行在 Kubernetes 集群内部,作为一个代理 Pod 管理安装我们的 Charts。 而 Charts 配置至少需要两样:一是 Package 描述文件(Chart.yaml),主要用来针对该资源包进行一些必要的说明信息。二是一个或多个包含应用需要安装的 Kubernetes 清单文件的模板文件。

2、环境、软件准备

通过之前的文章 初试 Kubernetes 集群中使用 Helm 搭建 Spinnaker 平台 ,我们已经演示了如何通过 Helm 安装 Spinnaker 平台到本地 Kubernetes 集群中。本次演示环境,我依旧是在本机 MAC OS 上操作,以下是安装的软件及版本:

  • Docker: version 17.09.0-ce
  • Oracle VirtualBox: version 5.1.20 r114628 (Qt5.6.2)
  • Minikube: version v0.22.2
  • Helm: version v2.8.0
  • Kuberctl:
    • Client Version: v1.7.5
    • Server Version: v1.7.5

注意:这里 Kubernetes 集群搭建我使用 Minikube 来完成,Minikube 启动的单节点 k8s Node 实例是需要运行在本机的 VM 虚拟机里面,所以需要提前安装好 VM,这里我选择 Oracle VirtualBox。k8s 运行底层使用 Docker 容器,所以本机需要安装好 Docker 环境,这里忽略 Docker、VirtualBox 的安装过程,着重介绍下 Minikube、Kuberctl 和 Helm 的安装。

3、安装并配置 Minikube

之前文章 初试 minikube 本地部署运行 kubernetes 实例 中,我有详细介绍 Minikube 以及 kubectl 安装,这里我再次简单描述一下,不过有一点要注意的地方,就是如何通过 HomeBrew 安装指定版本软件 。

首先我们需要安装 Minikube 到本机 MacOS 上,具体操作命令如下:

# 安装指定版本,例如:v0.22.3
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.22.3/minikube-darwin-amd64
2、赋二进制文件执行权限
$ chmod +x minikube
3、将二进制文件移到 PATH 中 
$ sudo mv minikube /usr/local/bin/

其次还需要安装 kubectl 来管理 Kubernetes 集群,具体操作命令如下:

1、安装最新版
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/darwin/amd64/kubectl
2、赋二进制文件执行权限
chmod +x ./kubectl
3、将二进制文件移到 PATH 中
sudo mv ./kubectl /usr/local/bin/kubectl

当然,针对 MacOS 系统,可以使用 Homebrew 工具执行 brew install kubectl 命令安装即可。这里,要注意一下,使用 HomeBrew 工具安装确实很方便,但是它默认安装的是最新版本,由于我们 Kubernetes 安装的版本为 v1.7.5,为了避免出现工具版本兼容性问题,所以 kubectl 最好也安装该版本。那么问题来了,如何让 HomeBrew 安装指定版本,而非默认最新版本呢?

4、HomeBrew 安装指定版本 kubectl

首先,我们需要找到 HomeBrew 安装软件的安装源在哪里,通过命令 helm info xxxx 可以得到相关信息。例如,我们查看 kubectl 的相关信息。

$ brew info kubectl
kubernetes-cli: stable 1.11.0 (bottled), HEAD
Kubernetes command-line interface
https://kubernetes.io/
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/kubernetes-cli.rb
==> Dependencies
Build: go ✔
==> Options
--HEAD
    Install HEAD version

从这个输出可以得到几个信息,首先 kubernetes-cli 最新版本已经到了 1.11.0 ,其次 From 字段显示了其安装源地址,最后,该软件需要依赖 go 语言环境。我们浏览器访问一下该安装源地址文件 https://github.com/Homebrew/homebrew-core/blob/master/Formula/kubernetes-cli.rb ,可以看到如下核心信息:

class KubernetesCli < Formula
  desc "Kubernetes command-line interface"
  homepage "https://kubernetes.io/"
  url "https://github.com/kubernetes/kubernetes.git",
      :tag => "v1.11.0",
      :revision => "91e7b4fd31fcd3d5f436da26c980becec37ceefe"
  head "https://github.com/kubernetes/kubernetes.git"
......

该文件中 :tag :revision 就是控制安装源版本的地方。只要我们能够将这两个标记切换到指定版本 tag 和 revision ,那么 HomeBrew 就能安装指定版本了。接下来,我们 clone 整个 Homebrew/homebrew-core 库到本地。

$ git clone https://github.com/Homebrew/homebrew-core.git

然后,查看 kubernetes-cli.rb 文件所有提交记录,从中找到 1.7.5 版本 commit_id。

$ cd homebrew-core
$ git log ./Formula/kubernetes-cli.rb | less
......
commit 6efa7fb97724c27bf436a8b888008cc821f5b186
Author: Christoph Blecker <admin@toph.ca>
Date:   Thu Aug 31 12:27:35 2017 -0700
    kubernetes-cli 1.7.5
    Closes #17448.
    Signed-off-by: JCount <JCount42@gmail.com>
......    

我们找到 kubernetes-cli 1.7.5 版本的 commit_id 为 6efa7fb97724c27bf436a8b888008cc821f5b186 ,接下来,切换到该 commit 版本。

$ git checkout 6efa7fb

此时,再次查看 kubernetes-cli.rb 文件,就是我们需要的指定版本源信息了。

$ cat ./Formula/kubernetes-cli.rb
class KubernetesCli < Formula
  desc "Kubernetes command-line interface"
  homepage "https://kubernetes.io/"
  url "https://github.com/kubernetes/kubernetes.git",
      :tag => "v1.7.5",
      :revision => "17d7182a7ccbb167074be7a87f0a68bd00d58d97"
  head "https://github.com/kubernetes/kubernetes.git"
......

最后,执行 brew 安装命令,指定该安装源文件即可完成指定版本 kubectl 的安装。

$ brew install ./Formula/kubernetes-cli.rb

安装完毕,使用 kubectl 命令查看版本信息,确实是否安装成功。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.5", GitCommit:"17d7182a7ccbb167074be7a87f0a68bd00d58d97", GitTreeState:"clean", BuildDate:"2017-08-31T09:14:02Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"darwin/amd64"}

以上都安装完毕后,就可以启动 Minikube 了。在启动之前,我们还需要配置一下 Minikube VM 分配内存、CPU 和存储空间,因为根据官网文档 GitLab-Omnibus Helm Chart ,集群配置至少如下:

  • At least 4 GB of RAM available on your cluster. 41GB of storage and 2 CPU * are also required.
  • Kubernetes 1.4+ with Beta APIs enabled
  • Persistent Volume provisioner support in the underlying infrastructure
  • A wildcard DNS entry, which resolves to the external IP address
  • The kubectl CLI installed locally and authenticated for the cluster
  • The Helm client installed locally on your machine

所以,为了满足应用配置的需要,我们要保证 Minikube VM 至少分配 4G 内存、2核 CPU 和 41G 存储空间,可以通过以下命令行操作:

# 设置内存大小
$ minikube config set memory 4096
# 设置 CPU 核数
$ minikube config set cpus 2
# 设置存储空间大小
$ minikube config set disk-size 51200 

设置完成后,就可以执行 minikube start 操作了。当然如果觉得这样比较麻烦,我们也可以在执行 minikube start 命令时,指定参数配置也可以。

$ minikube start --memory 4096 --cpus 2 --disk-size 51200
Starting local Kubernetes v1.7.5 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.

此时,去 VirtualBox 界面可以看到 Minikube 虚拟机已经成功启动了。我们也可以通过命令行查看一下集群状态。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.5", GitCommit:"17d7182a7ccbb167074be7a87f0a68bd00d58d97", GitTreeState:"clean", BuildDate:"2017-08-31T09:14:02Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.5", GitCommit:"17d7182a7ccbb167074be7a87f0a68bd00d58d97", GitTreeState:"clean", BuildDate:"2017-09-18T20:30:29Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}

这里要提醒一下,如果是第一次启动 Minikube,很有可能因为网络的问题,下载国外镜像失败导致启动服务失败,参照上边文章中提到的解决办法,替代需要访问外国网站下载的 images 即可。注意:直接在当前窗口上执行 docker images 是不会列举出来 Minikube 虚拟机内部镜像列表的,需要通过命令设置 Minikube 虚拟机的 Docker 环境变量。

$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/wanyang3/.minikube/certs"
export DOCKER_API_VERSION="1.23"
# Run this command to configure your shell:
# eval $(minikube docker-env)
# 设置 Docker 环境变量
$ eval $(minikube docker-env)
$ docker images
REPOSITORY                                             TAG                            IMAGE ID            CREATED             SIZE
gcr.io/google-containers/kube-addon-manager            v6.4-beta.2                    51a9cd46a30c        2 months ago        79.2MB
gcr.io/google_containers/kubernetes-dashboard-amd64    v1.6.3                         4da5a945ae40        4 months ago        88.9MB
gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64   1.14.4                         dbe106a365a5        6 months ago        41.4MB
gcr.io/google_containers/k8s-dns-sidecar-amd64         1.14.4                         db6d003fad04        6 months ago        41.8MB
gcr.io/google_containers/k8s-dns-kube-dns-amd64        1.14.4                         a8e00546bcf3        8 months ago        49.4MB
gcr.io/google_containers/pause-amd64                   3.0                            99e59f495ffa        22 months ago       747kB

5、安装并初始化 Helm

好了,Kubernetes 集群已经有了,在正式安装 Gitlab 之前,我们需要安装 Helm 客户端到本地,同时安装服务端 Tiller 到 Kubernetes 中。Helm 安装方式有很多种,这里我就针对本机 MacOS 系统用两种方式安装一下。

方式一:下载最新版 release 版 Helm 二进制码安装。

$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.8.0-darwin-amd64.tar.gz
$ tar -zxvf helm-v2.7.2-darwin-amd64.tar.gz
$ chmod +x ./darwin-amd64/helm
$ mv ./darwin-amd64/helm /usr/local/bin/

方式二:使用 HomeBrew 安装。

$ brew install kubernetes-helm

接下来,我们需要初始化并验证 Helm 了。

$ helm init
Creating /Users/wanyang3/.helm
Creating /Users/wanyang3/.helm/repository
Creating /Users/wanyang3/.helm/repository/cache
Creating /Users/wanyang3/.helm/repository/local
Creating /Users/wanyang3/.helm/plugins
Creating /Users/wanyang3/.helm/starters
Creating /Users/wanyang3/.helm/cache/archive
Creating /Users/wanyang3/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /Users/wanyang3/.helm.

稍等一会,你就会发现服务端 Tiller 已经安装到 Minikube 集群中了,并且作为 Kubernetes Pod 服务运行在 kube-system 的 namespace 中.

$ helm version
Client: &version.Version{SemVer:"v2.8.0", GitCommit:"14af25f1de6832228539259b821949d20069a222", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.8.0", GitCommit:"14af25f1de6832228539259b821949d20069a222", GitTreeState:"clean"}
$ kubectl get pods --all-namespaces
NAMESPACE     NAME                              READY     STATUS    RESTARTS   AGE
default       hello-minikube-2754686071-0g6h3   1/1       Running   1          1d
kube-system   kube-addon-manager-minikube       1/1       Running   1          1d
kube-system   kube-dns-910330662-04l0k          3/3       Running   3          1d
kube-system   kubernetes-dashboard-2lvgh        1/1       Running   1          1d
kube-system   tiller-deploy-246345418-sqx12     1/1       Running   3          1d

这里值的一提的是,由于国内网络的问题,在安装 Tiller 的时候,需要下载镜像 gcr.io/kubernetes-helm/tiller:v2.8.0 ,很有可能会安装失败,这里我借鉴网上下载国外镜像的方式,通过 DockerHub 官网 中 “Create Automated Build” 功能中的 “Create Auto-build Github”,关联自己的 GitHub 项目,可以选择对应的 dockerfile 文件,来执行自动构建,从而将生成的指定 Docker Image 镜像上传到 DockerHub 上。通过这个功能,我将 Tiller 需要的镜像上传到了我的 DockerHub 仓库里面去了,然后在本地 Minikube 中下载镜像,修改镜像名称即可,虽然麻烦了点,但是解决了我们不能下载国外镜像的难题。

$ docker pull huwanyang168/tiller:v2.8.0
$ docker tag huwanyang168/tiller:v2.8.0 gcr.io/kubernetes-helm/tiller:v2.8.0

执行上述操作后,再执行 helm init 命令,就可以避开镜像下载不到的问题,从而完成 Tiller 的安装和启动。如果 Tiller 安装失败,通过 helm version 命令会提示连接不到 Tiller。

6、使用 Helm 安装 Gitlab

现在 Minikube 和 Helm 已经运行起来了,接下来我们可以安装 Gitlab 到 Kubernetes 中了。在 Kubernetes Charts GitHub 中已经支持 Gitlab Chart 方式安装,安装过程非常简单,就一条命令就可以完成整个安装。在开始安装之前,需要一个 Yaml 配置文件(values.yaml)来配置 Gitlab 相关信息。我们可以从 Gitlab Helm Chart GitHub 中获取最新版下载到本地并配置相关信息。

## GitLab CE image
## ref: https://hub.docker.com/r/gitlab/gitlab-ce/tags/
image: gitlab/gitlab-ce:10.6.2-ce.0
## Specify a imagePullPolicy
## 'Always' if imageTag is 'latest', else set to 'IfNotPresent'
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
imagePullPolicy: IfNotPresent
## The URL (with protocol) that your users will use to reach the install.
## ref: https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab
externalUrl: http://my.gitlab.com/
## Change the initial default admin password if set. If not set, you'll be
## able to set it when you first visit your install.
gitlabRootPassword: "123456hwy"
## For minikube, set this to NodePort, elsewhere use LoadBalancer
## ref: http://kubernetes.io/docs/user-guide/services/#publishing-services---service-types
serviceType: NodePort
## Ingress configuration options
ingress:
  annotations:
      # kubernetes.io/ingress.class: nginx
      # kubernetes.io/tls-acme: "true"
  enabled: false
      # - secretName: gitlab.cluster.local
      #   hosts:
      #     - gitlab.cluster.local
  url: gitlab.cluster.local
## Configure external service ports
## ref: http://kubernetes.io/docs/user-guide/services/
sshPort: 22
httpPort: 80
httpsPort: 443
## livenessPort Port of liveness probe endpoint
livenessPort: http
## readinessPort Port of readiness probe endpoint
readinessPort: http
## Configure resource requests and limits
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
resources:
  ## GitLab requires a good deal of resources. We have split out Postgres and
  ## redis, which helps some. Refer to the guidelines for larger installs.
  ## ref: https://docs.gitlab.com/ce/install/requirements.html#hardware-requirements
  requests:
    memory: 1Gi
    cpu: 500m
  limits:
    memory: 2Gi
    cpu: 1
## Enable persistence using Persistent Volume Claims
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
## ref: https://docs.gitlab.com/ce/install/requirements.html#storage
persistence:
  ## This volume persists generated configuration files, keys, and certs.
  gitlabEtc:
    enabled: true
    size: 1Gi
    ## If defined, volume.beta.kubernetes.io/storage-class: <storageClass>
    ## Default: volume.alpha.kubernetes.io/storage-class: default
    # storageClass:
    accessMode: ReadWriteOnce
  ## This volume is used to store git data and other project files.
  ## ref: https://docs.gitlab.com/omnibus/settings/configuration.html#storing-git-data-in-an-alternative-directory
  gitlabData:
    enabled: true
    size: 10Gi
    ## If defined, volume.beta.kubernetes.io/storage-class: <storageClass>
    ## Default: volume.alpha.kubernetes.io/storage-class: default
    # storageClass:
    accessMode: ReadWriteOnce
## Configuration values for the postgresql dependency.
## ref: https://github.com/kubernetes/charts/blob/master/stable/postgresql/README.md
postgresql:
  # 9.6 is the newest supported version for the GitLab container
  imageTag: "9.6.5"
  cpu: 1000m
  memory: 1Gi
  postgresUser: gitlab
  postgresPassword: gitlab
  postgresDatabase: gitlab
  persistence:
    size: 10Gi
## Configuration values for the redis dependency.
## ref: https://github.com/kubernetes/charts/blob/master/stable/redis/README.md
redis:
  redisPassword: "gitlab"
  resources:
    requests:
      memory: 1Gi
  persistence:
    size: 10Gi

注意:这里大多都是官方默认配置,不过有几个地方需要修改下配置:

  • image :这里使用比较新的版本 gitlab/gitlab-ce:10.6.2-ce.0 镜像,默认 gitlab/gitlab-ce:9.4.1-ce.0 版本有点低。
  • imagePullPolicy :这里配置为 IfNotPresent ,优先从本地查找镜像,避免每次都去获取最新镜像,导致版本兼容性问题。
  • externalUrl :这里为配置外部访问 Gitlab 服务域名地址,我们暂时填写为 http://my.gitlab.com/ ,后边配置 Ingress 配合本地 Host 绑定方式即可访问。
  • gitlabRootPassword :这里为配置 Gitlab 管理员密码,初次登录时需要使用,不填或者密码强度(8为长度即可)不够的话,会导致登录不进去 Gitlab。
  • serviceType :这里为配置服务类型,我们使用 Minikube 可以配置为 NodePort 访问,其他集群方式可配置为 LoadBalancer 方式。

OK,最后使用 Helm 执行一条命令即可完成安装。

$ helm install --name gitlab -f values.yaml stable/gitlab-ce

说明一下, helm install ... 命令可以配置其他启动参数,这里使用了最基本参数的配置,默认安装到 default 命名空间,如果想指定其他命名空间安装,可以使用参数 --namespace xxx 来完成。

执行完毕,稍等一会,就会发现控制台输出 Gitlab 已经安装完成并启动完成啦!

$ helm install --name gitlab -f values.yaml stable/gitlab-ce
Error: failed to download "stable/gitlab-ce"
bj-m-204072a:k8s-gitlab-ce wanyang3$ helm install --name gitlab -f values.yaml stable/gitlab-ce
NAME:   gitlab
LAST DEPLOYED: Wed Jul 11 11:36:36 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Secret
NAME               TYPE    DATA  AGE
gitlab-postgresql  Opaque  1     2s
gitlab-redis       Opaque  1     2s
gitlab-gitlab-ce   Opaque  4     2s
==> v1/ConfigMap
NAME              DATA  AGE
gitlab-gitlab-ce  1     2s
==> v1/PersistentVolumeClaim
NAME                   STATUS   VOLUME                                    CAPACITY  ACCESS MODES  STORAGECLASS  AGE
gitlab-postgresql      Pending  standard                                  2s
gitlab-redis           Bound    pvc-9d3f3747-84bb-11e8-ad5b-080027de4c7f  10Gi  RWO  standard  2s
gitlab-gitlab-ce-data  Bound    pvc-9d401d9d-84bb-11e8-ad5b-080027de4c7f  10Gi  RWO  standard  2s
gitlab-gitlab-ce-etc   Pending  standard                                  2s
==> v1/Service
NAME               TYPE          CLUSTER-IP  EXTERNAL-IP  PORT(S)                                  AGE
gitlab-postgresql  ClusterIP     10.0.0.77   <none>       5432/TCP                                 2s
gitlab-redis       ClusterIP     10.0.0.67   <none>       6379/TCP                                 2s
gitlab-gitlab-ce   LoadBalancer  10.0.0.133  <pending>    22:30733/TCP,80:30638/TCP,443:31737/TCP  1s
==> v1beta1/Deployment
NAME               DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
gitlab-postgresql  1        1        1           0          1s
gitlab-redis       1        1        1           0          1s
gitlab-gitlab-ce   1        1        1           0          1s
==> v1/Pod(related)
NAME                                READY  STATUS   RESTARTS  AGE
gitlab-postgresql-1290581213-jbm0s  0/1    Pending  0         1s
gitlab-redis-2286670209-dfrks       0/1    Pending  0         0s
gitlab-gitlab-ce-2349088227-z1nkn   0/1    Pending  0         0s
NOTES:
##############################################################################
This chart has been deprecated in favor of the official GitLab chart:
http://docs.gitlab.com/ce/install/kubernetes/gitlab_omnibus.html
##############################################################################
1. Get your GitLab URL by running:
  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc -w gitlab-gitlab-ce'
  export SERVICE_IP=$(kubectl get svc --namespace default gitlab-gitlab-ce -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  echo http://$SERVICE_IP/
2. Login as the root user:
  Username: root
  Password: 123456hwy
3. Point a DNS entry at your install to ensure that your specified
   external URL is reachable:
   http://my.gitlab.com/

我们通过 kubectl 命令行查看一下 Gitlab 相关组件和服务是否启动成功吧!

$ kubectl get pods
NAME                                 READY     STATUS    RESTARTS   AGE
gitlab-gitlab-ce-2349088227-z1nkn    1/1       Running   0          5m
gitlab-postgresql-1290581213-jbm0s   1/1       Running   0          5m
gitlab-redis-2286670209-dfrks        1/1       Running   0          5m
$ kubectl get svc
NAME                CLUSTER-IP   EXTERNAL-IP   PORT(S)                                   AGE
gitlab-gitlab-ce    10.0.0.133   <nodes>       22:30733/TCP,80:30638/TCP,443:31737/TCP   5h
gitlab-postgresql   10.0.0.77    <none>        5432/TCP                                  5h
gitlab-redis        10.0.0.67    <none>        6379/TCP                                  5h
kubernetes          10.0.0.1     <none>        443/TCP                                   12d

启动成功,我们可以通过浏览器访问 http://<cluster_ip>:<node_port> 地址来访问 Gitlab 服务,这里我本地可以通过 http://192.168.99.101:30638/ 地址访问 Gitlab 服务,当然也可以使用 Minikube 命令 minikube service gitlab-gitlab-ce 直接浏览器打开该服务访问。

尝试使用配置的管理员账号密码登录也都是没有问题的。

7、配置 Ingress 访问 GitLab

上边我们配置了 externalUrl: http://my.gitlab.com/ ,意思是可以外部通过域名 http://my.gitlab.com/ 访问 Gitlab 服务,这里就存在一个路由转发问题,我们的 Gitlab Web 服务通过 80:30638 外部端口 30638 映射容器 80 端口,外部访问可以通过 http://<cluster_ip>:<node_port> 方式,或者使用外部 Nginx 等代理将请求转到到该 30638 端口,但都不是很方便。我们需要的是不管后端 Kubernetes 中 Gitlab 服务增加还是减少,都不需要修改配置,依旧直接可以通过域名访问,那么就可以使用 Ingress 实现了。

Kubernetes Ingress 暴漏服务详细介绍,可以参考之前文章 初试 Kubernetes 暴漏服务类型之 Nginx Ingress ,那里是通过 yaml 文件来部署 Default Backend Ingress Controller 的,因为这里我们使用的是 Minikube,它本身支持部署 Ingress 服务,所以可以使用 Minikube 命令行方式安装它们。

$ minikube addons list
- kube-dns: enabled
- ingress: disabled
- registry: disabled
- addon-manager: enabled
- dashboard: enabled
- default-storageclass: enabled
- heapster: disabled
- registry-creds: disabled  

通过该命令,可以列举出 Minikube 所支持的插件集列表,以及是否已经开启该服务。默认 ingress 服务是 disabled 关闭状态,那么我们只需要将其设置为 enabled 开启状态,然后重启 Minikube 服务,即可自动部署 Default Backend Ingress Controller 服务。

$ minikube addons enabled ingress
$ minikube stop
$ minikube start

注意:这里自动安装 Ingress 需要下载两个镜像 gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.11 gcr.io/google_containers/defaultbackend:1.0 ,如果国内网络不通的话,请自行 Docker Hub 查找该镜像,然后修改为该名称镜像即可。启动成功后,可以通过 kubectl 命令行查看如下:

$ kubectl get pods -n kube-system
NAME                             READY     STATUS    RESTARTS   AGE
default-http-backend-j2bmz       1/1       Running   1          1h
nginx-ingress-controller-9tq68   1/1       Running   1          1h
kube-addon-manager-minikube      1/1       Running   1          2d
kube-dns-910330662-lj3xz         3/3       Running   3          2d
kubernetes-dashboard-wx8gl       1/1       Running   1          2d
tiller-deploy-246345418-8lqpm    1/1       Running   1          2h

接下来,我们需要新建一个基于域名访问虚拟主机的 Ingress 配置,Yaml 文件如下:

# 创建 Yaml 文件
$ vim my-gitlab-com.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-gitlab-com
  namespace: default
spec:
  rules:
  - host: my.gitlab.com
    http:
      paths:
      - backend:
          serviceName: gitlab-gitlab-ce
          servicePort: 80
# 创建 ingress
$ kubectl create -f my-gitlab-com.yaml
ingress "my-gitlab-com" created
# 查看 ingress
$ kubectl get ingress --all-namespaces
NAMESPACE     NAME             HOSTS            ADDRESS          PORTS     AGE
default       my-gitlab-com    my.gitlab.com    192.168.99.101   80        5s

注意: host: my.gitlab.com 这里就是跟上边定义的 externalUrl 一致,外部通过该域名来访问 gitlab 服务, serviceName: gitlab-gitlab-ce 这里就是我们启动的 gitlab 服务名称,可通过 kubectl get svc --all-namespaces 命令查找对应服务名称,例如:

$ kubectl get svc --all-namespaces
NAMESPACE     NAME                   CLUSTER-IP   EXTERNAL-IP   PORT(S)                                   AGE
default       gitlab-gitlab-ce       10.0.0.133   <nodes>       22:30733/TCP,80:30638/TCP,443:31737/TCP   2d
default       gitlab-postgresql      10.0.0.77    <none>        5432/TCP                                  2d
default       gitlab-redis           10.0.0.67    <none>        6379/TCP                                  2d
default       kubernetes             10.0.0.1     <none>        443/TCP                                   13d
kube-system   default-http-backend   10.0.0.145   <nodes>       80:30001/TCP                              2d
kube-system   kube-dns               10.0.0.10    <none>        53/UDP,53/TCP                             13d
kube-system   kubernetes-dashboard   10.0.0.161   <nodes>       80:30000/TCP                              13d
kube-system   tiller-deploy          10.0.0.112   <none>        44134/TCP                                 11d

好了,通过上边操作,已经把域名绑定到指定的 Service 上了。然后,我们要能本地访问,还需要本机绑定 Host。