Kubernetes Docker Registry
Из примера с katacoda:
https://www.katacoda.com/javajon/courses/kubernetes-pipelines/tekton
$ {
minikube --profile my-profile config set memory 8192
minikube --profile my-profile config set cpus 4
minikube --profile my-profile config set vm-driver virtualbox
// minikube --profile my-profile config set vm-driver docker
minikube --profile my-profile config set kubernetes-version v1.14.1
minikube start --profile my-profile
}
// Удалить
// $ minikube --profile my-profile stop && minikube --profile my-profile delete
Инсталляция пакетов с помощью helm
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
$ helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
$ helm repo update
$ helm install private stable/docker-registry --namespace kube-system
Install Registry Proxies as Node Daemons
$ helm install registry-proxy incubator/kube-registry-proxy \
--set registry.host=private-docker-registry.kube-system \
--set registry.port=5000 \
--set hostPort=5000 \
--namespace kube-system
Pods can pull images from the registry at http://localhost:5000 and the proxies resolve the requests to https://private-docker-registry.kube-system:5000.
Install Registry UI
https://github.com/Joxit/docker-registry-ui
$ cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: registry-ui-deployment
labels:
app: registry-ui
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: registry-ui
template:
metadata:
labels:
app: registry-ui
spec:
containers:
- name: reg-ui
image: joxit/docker-registry-ui:static
env:
- name: REGISTRY_URL
value: "http://private-docker-registry:5000"
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: registry-ui
labels:
app: registry-ui
namespace: kube-system
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 31000
protocol: TCP
selector:
app: registry-ui
EOF
$ kubectl get svc -n kube-system | grep private-docker-registry
private-docker-registry ClusterIP 10.102.91.197 <none> 5000/TCP 17m
$ minikube --profile my-profile ip
192.168.99.130
http://192.168.99.130:31000/
Deploy Tekton Controller
$ kubectl apply --filename https://storage.googleapis.com/tekton-releases/latest/release.yaml
$ watch kubectl get deployments,pods,services --namespace tekton-pipelines
$ kubectl get crds
NAME CREATED AT
clustertasks.tekton.dev 2020-04-23T14:19:27Z
conditions.tekton.dev 2020-04-23T14:19:27Z
images.caching.internal.knative.dev 2020-04-23T14:19:27Z
pipelineresources.tekton.dev 2020-04-23T14:19:27Z
pipelineruns.tekton.dev 2020-04-23T14:19:27Z
pipelines.tekton.dev 2020-04-23T14:19:27Z
taskruns.tekton.dev 2020-04-23T14:19:27Z
tasks.tekton.dev 2020-04-23T14:19:27Z
Tekton CLI installation
# Get the tar.xz
$ curl -LO https://github.com/tektoncd/cli/releases/download/v0.8.0/tkn_0.8.0_Linux_x86_64.tar.gz
# Extract tkn to your PATH (e.g. /usr/local/bin)
$ sudo tar xvzf tkn_0.8.0_Linux_x86_64.tar.gz -C /usr/local/bin/ tkn
Clone Example Node.js App
$ cd ~/tmp/
$ git clone https://github.com/javajon/node-js-tekton
$ cd node-js-tekton
Declare Service Account
$ kubectl apply -f pipeline/service-account.yaml
$ kubectl get ServiceAccounts
NAME SECRETS AGE
default 1 52m
service-account 1 16s
Declare Pipeline Resources
pipeline/git-resource.yaml
$ cat << EOF | kubectl apply -f -
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: git
spec:
type: git
params:
- name: revision
value: master
- name: url
value: https://github.com/javajon/node-js-tekton
EOF
$ tkn resources list
NAME TYPE DETAILS
git git url: https://github.com/javajon/node-js-tekton
[email protected]:~/projects/dev/devops/voting-tekton$
Declare Pipeline Tasks
For our pipeline, we have defined two tasks.
- task-build-src clones the source, builds the Node.js based container, and pushed the image to a registry.
- task-deploy pulls the container image from the private registry and runs it on this Kubernetes cluster.
$ kubectl apply -f pipeline/task-build-src.yaml
$ kubectl apply -f pipeline/task-deploy.yaml
$ tkn tasks list
NAME AGE
build-image-from-source 1 minute ago
deploy-application 2 seconds ago
Declare Pipeline
$ kubectl apply -f pipeline/pipeline.yaml
$ tkn pipelines list
NAME AGE LAST RUN STARTED DURATION STATUS
application-pipeline 13 seconds ago --- --- --- ---
Declare Runner for Pipeline
pipeline/pipeline-run.yaml
$ cat << EOF | kubectl apply -f -
apiVersion: tekton.dev/v1alpha1
kind: PipelineRun
metadata:
name: application-pipeline-run
spec:
pipelineRef:
name: application-pipeline
resources:
- name: git-source
resourceRef:
name: git
params:
- name: pathToContext
value: "src"
- name: pathToYamlFile
value: "deploy.yaml"
- name: "imageUrl"
value: "private-docker-registry.kube-system:5000/app"
- name: "imageTag"
value: "0.0.1"
serviceAccountName: service-account
EOF
$ tkn pipelineruns list
NAME STARTED DURATION STATUS
application-pipeline-run 56 seconds ago --- Running
$ tkn pipelineruns describe application-pipeline-run
Name: application-pipeline-run
Namespace: default
Pipeline Ref: application-pipeline
Service Account: service-account
🌡️ Status
STARTED DURATION STATUS
1 minute ago 1 minute Succeeded
📦 Resources
NAME RESOURCE REF
∙ git-source git
⚓ Params
NAME VALUE
∙ pathToContext src
∙ pathToYamlFile deploy.yaml
∙ imageUrl private-docker-registry.kube-system:5000/app
∙ imageTag 0.0.1
🗂 Taskruns
NAME TASK NAME STARTED DURATION STATUS
∙ application-pipeline-run-deploy-application-qd79d deploy-application 36 seconds ago 18 seconds Succeeded
∙ application-pipeline-run-build-image-from-source-txgvx build-image-from-source 1 minute ago 52 seconds Succeeded
Access Application
$ kubectl get deployments,pods,services
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/app 3/3 3 3 62s
NAME READY STATUS RESTARTS AGE
pod/app-79fd75857b-9smdc 1/1 Running 0 62s
pod/app-79fd75857b-jq7xx 1/1 Running 0 62s
pod/app-79fd75857b-rk4x8 1/1 Running 0 62s
pod/application-pipeline-run-build-image-from-source-txgvx-po-mgvwm 0/3 Completed 0 2m13s
pod/application-pipeline-run-deploy-application-qd79d-pod-2wg2w 0/3 Completed 0 80s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/app NodePort 10.96.65.174 <none> 8080:32000/TCP 62s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12m
Приложение доступно:
http://192.168.99.130:32000/