
Kubernetes Dashboard是一个易于使用的工具,用于获取有关工作集群的最新信息并对其进行最少的控制。 当不仅需要管理员/ DevOps工程师,而且需要不熟悉控制台和/或不打算处理与kubectl和其他实用程序交互的所有复杂问题的人员访问这些功能时,您甚至会更加欣赏它。 事情就这样发生了:开发人员希望快速访问Kubernetes Web界面,并且由于我们使用的是GitLab,因此解决方案自然而然。
怎么会这样
直接开发人员可能对诸如K8s仪表板之类的用于调试任务的工具感兴趣。 有时您想查看日志和资源,有时要杀死吊舱,扩展Deployment / StatefulSets甚至进入容器控制台(也有请求,这是另一种方法,例如,通过
kubectl-debug )。
此外,对于经理来说,当他们想要看一下集群时,会有一个心理时刻-看到“一切都是绿色的”,从而使“一切正常”平静下来(当然,这是非常相对的……但这超出了本文的范围) )
我们
将 GitLab用作标准CI系统:所有开发人员都使用它。 因此,要授予他们访问权限,将仪表板与GitLab中的帐户集成是合乎逻辑的。
另请注意,我们正在使用NGINX Ingress。 如果您使用其他
入口解决方案 ,则需要独立查找注释的类似物以进行授权。
我们尝试整合
安装仪表板
注意 :如果要重复以下步骤,则-为了避免不必要的操作-首先通读下一个字幕。由于我们在许多安装中都使用此集成,因此我们将其安装自动化。 所需的资源发布在
特殊的GitHub存储库中 。 它们基于
官方Dashboard存储库中经过稍微修改的YAML配置以及用于快速部署的Bash脚本。
该脚本将Dashboard安装在集群中,并将其配置为与GitLab集成:
$ ./ctl.sh Usage: ctl.sh [OPTION]... --gitlab-url GITLAB_URL --oauth2-id ID --oauth2-secret SECRET --dashboard-url DASHBOARD_URL Install kubernetes-dashboard to Kubernetes cluster. Mandatory arguments: -i, --install install into 'kube-system' namespace -u, --upgrade upgrade existing installation, will reuse password and host names -d, --delete remove everything, including the namespace --gitlab-url set gitlab url with schema (https://gitlab.example.com) --oauth2-id set OAUTH2_PROXY_CLIENT_ID from gitlab --oauth2-secret set OAUTH2_PROXY_CLIENT_SECRET from gitlab --dashboard-url set dashboard url without schema (dashboard.example.com) Optional arguments: -h, --help output this message
但是,在使用它之前,您需要转到GitLab:管理区域→应用程序-并为以后的面板添加新的应用程序。 我们称之为“ kubernetes仪表板”:

作为添加的结果,GitLab将提供哈希:

它们用作脚本的参数。 结果,安装如下:
$ ./ctl.sh -i --gitlab-url https://gitlab.example.com --oauth2-id 6a52769e… --oauth2-secret 6b79168f… --dashboard-url dashboard.example.com
之后,检查一切是否开始:
$ kubectl -n kube-system get pod | egrep '(dash|oauth)' kubernetes-dashboard-76b55bc9f8-xpncp 1/1 Running 0 14s oauth2-proxy-5586ccf95c-czp2v 1/1 Running 0 14s
迟早一切都会开始,但是
授权不会立即生效 ! 事实是,在所使用的映像中(其他映像中的情况类似),回调中的重定向捕获过程未正确实现。 这种情况导致oauth删除cookie的事实,而cookie本身(oauth)为我们提供了...
通过使用补丁构建您的oauth映像可以解决该问题。
修补到oauth并重新安装
为此,请使用以下Dockerfile:
FROM golang:1.9-alpine3.7 WORKDIR /go/src/github.com/bitly/oauth2_proxy RUN apk --update add make git build-base curl bash ca-certificates wget \ && update-ca-certificates \ && go get -u github.com/golang/dep/cmd/dep \ && curl -sSO https://raw.githubusercontent.com/pote/gpm/v1.4.0/bin/gpm \ && chmod +x gpm \ && mv gpm /usr/local/bin RUN git clone https://github.com/bitly/oauth2_proxy.git . \ && git checkout fa2771998a98a5bfdfa3c3503757668ac4f1c8ec ADD rd.patch . RUN patch -p1 < rd.patch && ./dist.sh FROM alpine:3.7 RUN apk --update add curl bash ca-certificates && update-ca-certificates COPY --from=0 /go/src/github.com/bitly/oauth2_proxy/dist/ /bin/ EXPOSE 8080 4180 ENTRYPOINT [ "/bin/oauth2_proxy" ] CMD [ "--upstream=http://0.0.0.0:8080/", "--http-address=0.0.0.0:4180" ]
这是rd.patch补丁本身 diff --git a/Gopkg.lock b/Gopkg.lock index 5a3758a..1294a90 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -131,7 +131,7 @@ version = "v1.0.0" [[projects]] - name = "gopkg.in/fsnotify.v1" + name = "gopkg.in/fsnotify/fsnotify.v1" packages = ["."] revision = "836bfd95fecc0f1511dd66bdbf2b5b61ab8b00b6" version = "v1.2.11" @@ -149,6 +149,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "b502c41a61115d14d6379be26b0300f65d173bdad852f0170d387ebf2d7ec173" + inputs-digest = "cfdd05348394cd0597edb858bdba5681665358a963356ed248d98f39373c33b5" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index c4005e1..422bd43 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -4,7 +4,7 @@ # [[constraint]] - name = "github.com/18F/hmacauth" + name = "github.com/mbland/hmacauth" version = "~1.0.1" [[constraint]] @@ -36,7 +36,7 @@ name = "google.golang.org/api" [[constraint]] - name = "gopkg.in/fsnotify.v1" + name = "gopkg.in/fsnotify/fsnotify.v1" version = "~1.2.0" [[constraint]] diff --git a/dist.sh b/dist.sh index a00318b..92990d4 100755 --- a/dist.sh +++ b/dist.sh @@ -14,25 +14,13 @@ goversion=$(go version | awk '{print $3}') sha256sum=() echo "... running tests" -./test.sh +#./test.sh -for os in windows linux darwin; do - echo "... building v$version for $os/$arch" - EXT= - if [ $os = windows ]; then - EXT=".exe" - fi - BUILD=$(mktemp -d ${TMPDIR:-/tmp}/oauth2_proxy.XXXXXX) - TARGET="oauth2_proxy-$version.$os-$arch.$goversion" - FILENAME="oauth2_proxy-$version.$os-$arch$EXT" - GOOS=$os GOARCH=$arch CGO_ENABLED=0 \ - go build -ldflags="-s -w" -o $BUILD/$TARGET/$FILENAME || exit 1 - pushd $BUILD/$TARGET - sha256sum+=("$(shasum -a 256 $FILENAME || exit 1)") - cd .. && tar czvf $TARGET.tar.gz $TARGET - mv $TARGET.tar.gz $DIR/dist - popd -done +os='linux' +echo "... building v$version for $os/$arch" +TARGET="oauth2_proxy-$version.$os-$arch.$goversion" +GOOS=$os GOARCH=$arch CGO_ENABLED=0 \ + go build -ldflags="-s -w" -o ./dist/oauth2_proxy || exit 1 checksum_file="sha256sum.txt" cd $DIR/dist diff --git a/oauthproxy.go b/oauthproxy.go index 21e5dfc..df9101a 100644 --- a/oauthproxy.go +++ b/oauthproxy.go @@ -381,7 +381,9 @@ func (p *OAuthProxy) SignInPage(rw http.ResponseWriter, req *http.Request, code if redirect_url == p.SignInPath { redirect_url = "/" } - + if req.FormValue("rd") != "" { + redirect_url = req.FormValue("rd") + } t := struct { ProviderName string SignInMessage string diff --git a/watcher.go b/watcher.go index bedb9f8..4b83946 100644 --- a/watcher.go +++ b/watcher.go @@ -7,8 +7,7 @@ import ( "os" "path/filepath" "time" - - "gopkg.in/fsnotify.v1" + "gopkg.in/fsnotify/fsnotify.v1" ) func WaitForReplacement(filename string, op fsnotify.Op,
现在,您可以构建图像并将其推送到我们的GitLab中。 接下来,在
manifests/kube-dashboard-oauth2-proxy.yaml
指定所需图像的使用(将其替换为您自己的图像):
image: docker.io/colemickens/oauth2_proxy:latest
如果您有通过授权关闭的注册表-不要忘记添加用于拉取映像的秘密:
imagePullSecrets: - name: gitlab-registry
...并为注册表添加秘密本身:
--- apiVersion: v1 data: .dockercfg: eyJyZWdpc3RyeS5jb21wYW55LmNvbSI6IHsKICJ1c2VybmFtZSI6ICJvYXV0aDIiLAogInBhc3N3b3JkIjogIlBBU1NXT1JEIiwKICJhdXRoIjogIkFVVEhfVE9LRU4iLAogImVtYWlsIjogIm1haWxAY29tcGFueS5jb20iCn0KfQoK = kind: Secret metadata: annotations: name: gitlab-registry namespace: kube-system type: kubernetes.io/dockercfg
细心的读者将从配置中看到上面的长行是base64:
{"registry.company.com": { "username": "oauth2", "password": "PASSWORD", "auth": "AUTH_TOKEN", "email": "mail@company.com" } }
这是GitLab中的用户数据,它是Kubernetes将从注册表中提取映像的代码。
完成所有操作后,您可以使用以下命令删除当前(运行不正常)的仪表板安装:
$ ./ctl.sh -d
...并重新安装所有内容:
$ ./ctl.sh -i --gitlab-url https://gitlab.example.com --oauth2-id 6a52769e… --oauth2-secret 6b79168f… --dashboard-url dashboard.example.com
现在是时候进入仪表板并找到相当古老的登录按钮了:

单击它之后,GitLab将与我们见面,并提供登录到它熟悉的页面上的功能(当然,如果我们没有在此处进行预授权):

使用您的GitLab凭据登录-一切都发生了:

关于仪表板功能
如果您是以前不使用Kubernetes的开发人员,或者由于某种原因以前没有使用过Dashboard,那么我将举例说明其某些功能。
首先,您会看到“一切都是绿色的”:

可在pod上获得更详细的数据,例如环境变量,缩小的图像,启动参数及其状态:

部署状态是可见的:

...和其他详细信息:

...以及扩展部署的能力:

该操作的结果:

在本文开头已经提到的其他有用功能包括查看日志:

...以及进入所选容器的容器控制台的功能:

例如,您还可以在节点上看到限制/请求:

当然,这不是面板的全部功能,但是我希望已经有了总体思路。
集成和仪表板的缺点
在描述的集成中,没有
访问控制 。 有了它,所有有权访问GitLab的用户都可以访问仪表板。 他们具有对仪表板的相同访问权限,对应
于RBAC中
定义的仪表板本身的权限。 显然,这并不适合每个人,但对于我们的案例,事实证明这已足够。
在仪表板本身明显的缺点中,我注意到以下几点:
- 无法进入初始化容器的控制台;
- 尽管可以在ClusterRole中解决此问题,但是无法编辑Deployment和StatefulSet。
- 仪表板与Kubernetes的最新版本的兼容性以及该项目的未来引发了疑问。
后一个问题值得特别注意。
仪表板状态和替代方法
该项目的最新版本(
v1.10.1 )中提供的具有Kubernetes发行版的Dashboard兼容性表不是很高兴:

尽管如此,
PR#3476 (已于1月采用)已宣布支持K8 1.13。 此外,在项目的问题中,您可以找到对使用K8s 1.14中的面板的用户的引用。 最后,对项目代码库的
提交不会停止。 因此(至少!)项目的实际状态并不像它在官方兼容性表中首次出现时那样糟糕。
最后,仪表板还有其他选择。 其中包括:
- K8Dash是一个年轻的界面(首次提交日期为今年3月),已经提供了良好的功能,例如可视化表示集群的当前状态及其对象的管理。 它被定位为“实时界面”,因为 自动更新显示的数据,而无需在浏览器中刷新页面。
- OpenShift控制台是Red Hat OpenShift的Web界面,但是,它将为您的集群带来其他项目成就,但并不适合所有人。
- Kubernator是一个有趣的项目,它被创建为一个较低级别的界面(比Dashboard界面),并具有查看集群中所有对象的能力。 但是,一切似乎都停止了发展。
- 北极星 - 几天前 宣布了一个项目, 该项目结合了面板的功能(显示集群的当前状态,但不管理其对象)和自动的“最佳实践验证”(检查集群中运行的Deployments的正确配置)。
而不是结论
仪表板是我们服务的Kubernetes集群的标准工具。 它与GitLab的集成也已成为我们“默认安装”的一部分,因为许多开发人员对该面板所带来的机遇感到满意。
Kubernetes Dashboard定期有来自开源社区的替代方案(我们很乐意考虑这些替代方案),但是在此阶段,我们仍然使用此解决方案。
聚苯乙烯
另请参阅我们的博客:
UPD 根据调查报告,补丁中发现一个错误(标签被空格替换)。 本文中的修补程序已更新。