Интегратсияи панели панели Kubernetes ва корбарони GitLab

Интегратсияи панели панели Kubernetes ва корбарони GitLab

Kubernetes Dashboard як воситаи осони истифодашаванда барои гирифтани маълумоти нав дар бораи кластери коркунанда ва идоракунии ҳадди ақали он мебошад. Шумо онро боз ҳам бештар қадр мекунед, вақте ки дастрасӣ ба ин қобилиятҳо на танҳо ба маъмурон/муҳандисони DevOps, балки ба онҳое, ки ба консол камтар одат кардаанд ва/ё ният надоранд, ки бо ҳама нозукиҳои ҳамкорӣ бо kubectl ва дигар коммуналй. Ин бо мо рӯй дод: таҳиягарон мехостанд ба веб-интерфейси Kubernetes дастрасии зуд дошта бошанд ва азбаски мо GitLab-ро истифода мебарем, ҳалли худ ба худ омад.

Чаро ин аст?

Таҳиягарони мустақим метавонанд ба асбобе ба монанди K8s Dashboard барои ислоҳи вазифаҳо таваҷҷӯҳ кунанд. Баъзан шумо мехоҳед, ки гузоришҳо ва захираҳоро бубинед ва баъзан подкҳоро кушед, Deployments/StatefulSets-ро миқёс кунед ва ҳатто ба консоли контейнер равед (инчунин дархостҳо мавҷуданд, ки барои онҳо роҳи дигар вуҷуд дорад - масалан, тавассути kubectl-debug).

Илова бар ин, барои менеҷерҳо як лаҳзаи равонӣ вуҷуд дорад, ки онҳо мехоҳанд ба кластер нигоҳ кунанд - бубинанд, ки "ҳама чиз сабз аст" ва ба ин васила худро итминон диҳанд, ки "ҳама чиз кор мекунад" (ки ин, албатта, хеле нисбӣ аст... аммо ин аз доираи мақола берун аст).

Ҳамчун як системаи стандартии CI мо дорем татбиқ карда мешавад GitLab: ҳамаи таҳиягарон низ онро истифода мебаранд. Аз ин рӯ, барои таъмини дастрасӣ ба онҳо, ҳамгироии панели панел бо ҳисобҳои GitLab мантиқӣ буд.

Ман инчунин қайд мекунам, ки мо NGINX Ingress-ро истифода мебарем. Агар шумо бо дигарон кор кунед ҳалли воридшавӣ, ба шумо лозим меояд, ки мустақилона аналогҳои эзоҳҳоро барои иҷозат пайдо кунед.

Кӯшиши ҳамгироӣ

Насби панели асбобҳо

Диққат: Агар шумо қадамҳои зерро такрор карданӣ бошед, пас - барои пешгирӣ кардани амалҳои нолозим - аввал ба зерсарлавҳаи оянда хонед.

Азбаски мо ин ҳамгироиро дар бисёр насбҳо истифода мебарем, мо насби онро автоматӣ кардем. Сарчашмаҳое, ки барои ин заруранд, дар интишор шудаанд анбори махсуси GitHub. Онҳо ба конфигуратсияҳои каме тағирёфтаи YAML асос ёфтаанд анбори расмии панели идоракунӣ, инчунин скрипти Bash барои ҷойгиркунии зуд.

Скрипт панели идоракуниро дар кластер насб мекунад ва онро барои ҳамгироӣ бо 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

Дар натиҷаи илова кардани он, 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 кукиеро, ки худи 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 
&& 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 bfda078caa55958cc37dcba39e57fc37f6a3c842  
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/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/dists
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

Акнун шумо метавонед тасвирро созед ва онро ба 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": "[email protected]"
}
}

Ин маълумоти корбар дар 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

Вақти он расидааст, ки ба панели идоракунӣ равед ва тугмаи хеле қадимии воридшавиро пайдо кунед:

Интегратсияи панели панели Kubernetes ва корбарони GitLab

Пас аз пахш кардани он, GitLab ба мо салом медиҳад ва пешниҳод мекунад, ки ба саҳифаи муқаррарии худ ворид шавед (албатта, агар мо қаблан ба он ҷо ворид нашуда бошем):

Интегратсияи панели панели Kubernetes ва корбарони GitLab

Мо бо маълумоти GitLab ворид мешавем - ва ҳама чиз анҷом дода мешавад:

Интегратсияи панели панели Kubernetes ва корбарони GitLab

Дар бораи хусусиятҳои панели идоракунӣ

Агар шумо як таҳиягар бошед, ки қаблан бо Kubernetes кор накардааст ё бо ягон сабаб қаблан бо панели идоракунӣ дучор нашудаед, ман баъзе аз қобилиятҳои онро нишон медиҳам.

Аввалан, шумо мебинед, ки "ҳама чиз сабз аст":

Интегратсияи панели панели Kubernetes ва корбарони GitLab

Маълумоти муфассалтар барои pods низ дастрас аст, ба монанди тағирёбандаҳои муҳити зист, тасвири зеркашидашуда, далелҳои оғозёбӣ ва ҳолати онҳо:

Интегратсияи панели панели Kubernetes ва корбарони GitLab

Ҷойгиркунӣ дорои статусҳои намоён мебошанд:

Интегратсияи панели панели Kubernetes ва корбарони GitLab

...ва тафсилоти дигар:

Интегратсияи панели панели Kubernetes ва корбарони GitLab

... ва инчунин қобилияти васеъ кардани густариш вуҷуд дорад:

Интегратсияи панели панели Kubernetes ва корбарони GitLab

Натиҷаи ин амалиёт:

Интегратсияи панели панели Kubernetes ва корбарони GitLab

Дар байни дигар хусусиятҳои муфид, ки аллакай дар аввали мақола зикр шудаанд, дидани гузоришҳо мебошанд:

Интегратсияи панели панели Kubernetes ва корбарони GitLab

... ва функсия барои ворид шудан ба консоли контейнерии подтаи интихобшуда:

Интегратсияи панели панели Kubernetes ва корбарони GitLab

Масалан, шумо инчунин метавонед ба маҳдудиятҳо/дархостҳо дар гиреҳҳо нигаред:

Интегратсияи панели панели Kubernetes ва корбарони GitLab

Албатта, ин на ҳама имкониятҳои панел мебошанд, аммо ман умедворам, ки шумо фикри умумиро ба даст меоред.

Камбудиҳои ҳамгироӣ ва панели идоракунӣ

Дар интегратсияи тавсифшуда вуҷуд надорад назорати дастрасӣ. Бо он, ҳамаи корбароне, ки ба GitLab дастрасӣ доранд, ба панели идоракунӣ дастрасӣ пайдо мекунанд. Онҳо дастрасии якхела дар худи панели идоракуниро доранд, ки ба ҳуқуқҳои худи панели идоракунӣ мувофиқанд дар RBAC муайян карда шудаанд. Аён аст, ки ин барои ҳама мувофиқ нест, аммо барои ҳолати мо он кофӣ буд.

Дар байни камбудиҳои назаррас дар худи панел, ман инҳоро қайд мекунам:

  • ворид шудан ба консоли контейнери init ғайриимкон аст;
  • таҳрир кардани Deployments ва StatefulSets ғайриимкон аст, гарчанде ки инро дар ClusterRole ислоҳ кардан мумкин аст;
  • Мутобиқати панели идоракунӣ бо версияҳои охирини Kubernetes ва ояндаи лоиҳа саволҳоро ба вуҷуд меорад.

Масъалаи охирин сазовори диккати махсус аст.

Ҳолати панели идоракунӣ ва алтернативаҳо

Ҷадвали мутобиқати панел бо версияҳои Kubernetes, ки дар версияи охирини лоиҳа пешниҳод шудааст (v1.10.1), чандон хурсанд нест:

Интегратсияи панели панели Kubernetes ва корбарони GitLab

Бо вуҷуди ин, вуҷуд дорад (аллакай дар моҳи январ қабул карда шудааст) PR № 3476, ки дастгирии K8s 1.13-ро эълон мекунад. Илова бар ин, дар байни масъалаҳои лоиҳа шумо метавонед истинодҳоро ба корбароне пайдо кунед, ки бо панел дар K8s 1.14 кор мекунанд. Ниҳоят, ухдадор мекунад ба базаи кодхозии лоиха бас на-мешавад. Ҳамин тавр (ҳадди ақалл!) Вазъи воқеии лоиҳа он қадар бад нест, зеро он аз ҷадвали мутобиқати расмӣ ба назар мерасад.

Ниҳоят, алтернативаҳо ба панели идоракунӣ мавҷуданд. Дар байни онҳо:

  1. K8Dash — интерфейси ҷавон (аввалин супоришҳо аз моҳи марти соли ҷорӣ рост меояд), ки аллакай хусусиятҳои хубро пешниҳод мекунад, ба монанди муаррифии визуалии ҳолати кунунии кластер ва идоракунии объектҳои он. Ҳамчун "интерфейси вақти воқеӣ" ҷойгир карда шудааст, зеро маълумоти намоишшударо ба таври худкор навсозӣ мекунад, бидуни талаб кардани навсозии саҳифа дар браузер.
  2. Консол OpenShift - веб-интерфейси Red Hat OpenShift, ки бо вуҷуди ин, дигар пешрафтҳои лоиҳаро ба кластери шумо меорад, ки барои ҳама мувофиқ нест.
  3. Кубернатор лоиҳаи ҷолибест, ки ҳамчун интерфейси сатҳи поёнӣ (назар ба панели идоракунӣ) бо қобилияти дидани ҳама объектҳои кластер сохта шудааст. Аммо, ба назар чунин мерасад, ки рушди он қатъ шудааст.
  4. Polaris - рӯзи дигар эълон кард Лоиҳае, ки вазифаҳои панелро (ҳолати кунунии кластерро нишон медиҳад, аммо объектҳои онро идора намекунад) ва автоматии "тасдиқ кардани таҷрибаҳои беҳтарин" (кластерро барои дурустии конфигуратсияҳои Ҷойгиркунии дар он иҷрошаванда тафтиш мекунад) муттаҳид мекунад.

Ба ҷои ба хулоса омадан

Панели дастгоҳ як воситаи стандартӣ барои кластерҳои Kubernetes, ки мо хидмат мекунем. Интегратсияи он бо GitLab инчунин як қисми насби пешфарзи мо гардид, зеро бисёре аз таҳиягарон аз қобилиятҳои онҳо бо ин панел ба ҳаяҷон меоянд.

Панели назоратии Kubernetes мунтазам алтернативаҳои ҷомеаи кушодаасос дорад (ва мо бо хушнудӣ онҳоро баррасӣ мекунем), аммо дар ин марҳила мо бо ин ҳалли худ мемонем.

PS

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ