목표

 -  kubectl 자동완성

 

 

 

1. bash-completion 설치

 $ yum install  bash-completion

 $ apt-get install bash-completion 

 

2. 설치 확인

 $ ls -l /usr/share/bash-completion/bash-completion

 

3. kubectl 자동활성 활성화

 방법 1) .bashrc에서 자동완성 스크립트 소싱

   $ echo 'source <(kubectl completion bash)' >>~/.bashrc

 

 방법 2) 자동 완성 스크립트를 /etc/bash_completion.d 디렉터리에 추가한다.

   $ kubectl completion bash >/etc/bash_completion.d/kubectl

 

 

*kubectl에 대한 앨리어스(alias)가 있는 경우, 해당 앨리어스로 작업하도록 셸 자동 완성을 확장할 수 있다.

$ echo 'alias k=kubectl' >>~/.bashrc 
$ echo 'complete -F __start_kubectl k' >>~/.bashrc

 

4. 사용

 - 탭으로 명령어 확인

 

참고)

https://kubernetes.io/ko/docs/tasks/tools/included/optional-kubectl-configs-bash-linux/#%EC%86%8C%EA%B0%9C

목표

 - deploy 서버에서 Cluster 접근

 

 

1. Deploy 서버에 K8S 설치

# yum install kubernetes

 

2. Copy Auth Files (Master -> Deploy) 

# scp test-master:/etc/kubernetes/pki/ca.crt /opt/kube-certs/test-cluster-ca.crt

# scp test-master:/etc/kubernetes/admin.conf /opt/kube-certs/test-cluster-admin.conf

# scp test-master:/etc/kubernetes/pki/ssl/apiserver-kubelet-client.crt /opt/kube-certs/test-cluster.client.crt

# scp test-master:/etc/kubernetes/pki/ssl/apiserver-kubelet-client.key /opt/kube-certs/test-cluster.client.key

 

3. 복사 된 파일 확인

[root@test-deploy kube-certs]# ls -l
test-cluster-admin.conf
test-cluster-ca.crt
test-cluster-client.crt
test-cluster-client.key

 

4. kubeconfig 파일 작성

/root/.kube/config
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /opt/kube-certs/test-cluster-ca.crt
    server: https://xx.xx.0.31:6443   #master001 IP
  name: test-cluster
contexts:
- context:
    cluster: test-cluster
    user: test-cluster-admin
  name: admin@test-cluster
current-context: admin@test-cluster
kind: Config
preferences: {}
users:
- name: test-cluster-admin
  user:
    client-certificate: /opt/kube-certs/test-cluster-client.crt
    client-key: /opt/kube-certs/test-cluster-client.key

 

5. daemon & kubectl restart

 

6. Context Switch

(k8s-env) [root@test-deploy .kube]# kubectl config  use-context admin@test-cluster
Switched to context "admin@test-cluster".

 

7. 현재 context 확인
(k8s-env) [root@test-deploy .kube]# kubectl config get-contexts
CURRENT   NAME                         CLUSTER        AUTHINFO             NAMESPACE
*                  admin@test-cluster   test-cluster    test-cluster-admin

 

8. 테스트

(k8s-env) [root@test-deploy .kube]# kubectl get nodes
NAME             STATUS    AGE
test-master001   Ready     12d
test-master002   Ready     12d
test-master003   Ready     12d
test-worker001   Ready     12d
test-worker002   Ready     12d

 

 

 

'Kubernetes' 카테고리의 다른 글

ETCD 백업 & 복구  (0) 2021.07.20
[bash 자동완성] bash-completion  (0) 2021.07.15
[kubespray] offline 설치 환경 구성  (0) 2021.06.01
[Nexus3] local docker registry 구성  (0) 2021.05.27
[Ingress-Nginx] Custom Error page 설정  (0) 2021.05.17

목적 : kubespray를 오프라인 환경에서 설치하기 위한 환경 구성

 

*nexus3 docker registry는 구성되어 있음.

 

 

 

1. kubespray 다운로드

[root@test-deploy opt]# git clone https://github.com/kubernetes-sigs/kubespray

*버전확인 : grep -r ^kube_version

*원하는 버전으로 checkout

 

 

2. python3 venv 환경 구성

[root@test-deploy kubespray]# yum install python3-pip
[root@test-deploy kubespray]# pip3 install virtualenv
[root@test-deploy kubespray]# virtualenv kubespray-venv
[root@test-deploy kubespray]# . kubespray-venv/bin/activate

(kubespray-venv) [root@test-deploy kubespray]# 

 

 

3. requirement 설치

(kubespray-venv) [root@test-deploy kubespray]# pip install -r requirements.txt

(kubespray-venv) [root@test-deploy kubespray]# deactivate

[root@test-deploy bin]#

 

 

4. kubespray 설치에 필요한 이미지 리스트 확보

[root@test-deploy kubespray]# cd contrib/offline

[root@test-deploy offline]# mkdir temp

[root@test-deploy offline]# bash generate_list.sh

[root@test-deploy offline]# ls temp/
files.list  generate.sh  images.list

 

5. docker image

5-1. docker images 다운로드

(이미지 옮기기)

5-2. docker images tag 변경

5-3. nexus3로 docker images push

5-4. docker image 리스트 확인

# curl 20.21.0.10:5000/v2/_catalog

*버전까지는 어떻게 보지?

 

 

6. kubernetes files 다운로드

/opt/kubespray/k8s_offline_file.sh
#!/bin/bash


DOWNLOAD_PATH=/tmp/kubespray.$(date +%Y%m%d)
HTTP_ROOT=/var/www/repos/kube_files   #DocumentRoot
KUBE_VERSION=v1.0.0
CALICO_VERSION=v1.0.0

mkdir -p ${DOWNLOAD_PATH}
for ofile in $(grep -v "^#" contrib/offline/temp/files.list)
do
  wget ${ofile} -P ${DOWNLOAD_PATH}
done


# copy http service path
cp ${DOWNLOAD_PATH}/calicoctl-linux-amd64                    ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/cni-plugins-linux-amd64-v0.9.1.tgz       ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/crictl-v1.21.0-linux-amd64.tar.gz        ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/crun-0.19-linux-amd64                    ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/etcd-v3.4.13-linux-amd64.tar.gz          ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/helm-v3.5.4-linux-amd64.tar.gz           ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/kata-static-1.12.1-x86_64.tar.xz         ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/krew.tar.gz                              ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/kubeadm                                  ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/kubectl                                  ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/kubelet                                  ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/nerdctl-0.8.1-linux-amd64.tar.gz         ${HTTP_ROOT}/
cp ${DOWNLOAD_PATH}/v3.18.4.tar.gz                           ${HTTP_ROOT}/

 

7. offline.yml에 repo 설정

/opt/kubespray/inventory/k8s/group_vars/all/offline.yml | grep -v ^#
---
registry_host: "20.21.0.10:5000"
files_repo: "http://20.21.0.10/kube_files"

yum_repo: "http://20.21.0.10"

kube_image_repo: "{{ registry_host }}"
gcr_image_repo: "{{ registry_host }}"
docker_image_repo: "{{ registry_host }}"
quay_image_repo: "{{ registry_host }}"

kubeadm_download_url: "{{ files_repo }}/kubeadm"
kubectl_download_url: "{{ files_repo }}/kubectl"
kubelet_download_url: "{{ files_repo }}/kubelet"

cni_download_url: "{{ files_repo }}/cni-plugins-linux-{{ image_arch }}-{{ cni_version }}.tgz"

crictl_download_url: "{{ files_repo }}/crictl-{{ crictl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"

etcd_download_url: "{{ files_repo }}/etcd-{{ etcd_version }}-linux-amd64.tar.gz"

calicoctl_download_url: "{{ files_repo }}/calicoctl-linux-{{ image_arch }}"
calico_crds_download_url: "{{ files_repo }}/{{ calico_version }}.tar.gz"

helm_download_url: "{{ files_repo }}/helm-{{ helm_version }}-linux-{{ image_arch }}.tar.gz"

crun_download_url: "{{ files_repo }}/crun-{{ crun_version }}-linux-{{ image_arch }}"


docker_rh_repo_base_url: "{{ yum_repo }}/docker-ce-stable"

 

8. local repo이기 때문에 gpgcheck=0 설정

# vi /opt/kubespray/roles/container-engine/docker/templates/rh_docker.repo.j2

 

 

9. ~/inventory/k8s/group_vars/에 추가 필요 설정

- metrics-server

- network 설정

- ceph 설정

- ingress 설정

- inventory.ini

...

 

 

10. 배포

 

 

1. selinux 비활성화

[setenforce 0 &  vi /etc/selinux/config]

 

2. nexus3 설치 및 실행

[root@test-deploy ~]# docker pull sonatype/nexus3

[root@test-deploy ~]# mkdir -p data/nexus-data && chown -R 200 data/nexus-data/

[root@test-deploy ~]# docker run -d -p 8081:8081 -p 5000:5000 --name nexus -v /root/data/nexus-data:/nexus-data sonatype/nexus3

 

3. url 접속 및 계정 초기화

 

 

4. Blob Store 생성

 

4-1. docker-hosted 생성

 

 

4-2 docker-hub 생성

 

 

5. Repository 생성

 

 

 

5-1. docker-hosted 생성 (hosted)

 

 

5-2. docker-hub 생성 (proxy)

 

 

 

 

6. Realms 설정

- Docker Bearer Token Realm 오른쪽으로 이동.

 

7. insecure-registries 설정 추가

/etc/docker/daemon.json 파일 생성
{
        "insecure-registries" : ["20.21.0.10:5000"]
}

 

8. 서비스 재시작

[root@test-deploy ~]# service docker restart
[root@test-deploy ~]# docker restart nexus

 

 

9. docker login
[root@test-deploy data]# docker login 20.21.0.10:5000
Username: admin
Password:
Login Succeeded

 

 

10. 이미지 다운로드

[root@test-deploy ~]# docker pull busybox
Using default tag: latest
Trying to pull repository docker.io/library/busybox ...
latest: Pulling from docker.io/library/busybox
92f8b3f0730f: Pull complete
Digest: sha256:b5fc1d7b2e4ea86a06b0cf88de915a2c43a99a00b6b3c0af731e5f4c07ae8eff
Status: Downloaded newer image for docker.io/busybox:latest

 

 

11. 이미지 tag 변경

[root@test-deploy ~]# docker tag docker.io/busybox:latest 20.21.0.10:5000/busybox:latest

 

 

12. nexus3 local repository에 업로드

[root@test-deploy ~]# docker push 20.21.0.10:5000/busybox
The push refers to a repository [20.21.0.10:5000/busybox]
d0d0905d7be4: Pushed

 

 

 

13. nexus3 docker registry에 있는 이미지 리스트 확인

[root@test-deploy nexus-data]# curl 20.21.0.10:5000/v2/_catalog | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    36  100    36    0     0   2253      0 --:--:-- --:--:-- --:--:--  2400
{
  "repositories": [
    "busybox",
    "httpd"
  ]
}

 

 

 

참고.

http://teddykwon.com/2017/01/12/docker-nexus-docker-registry.html

 

 

 

 

매칭되는 Host가 없을 경우.

Custom 404 에러페이지를 설정해보자.

 

 

 

1. 현재 설정

/aaa URL로 호출이 되면 my-nginx 서비스로 포워딩

/bbb URL로 호출이 되면 my-nginx2 서비스로 포워딩

 

 

2. 목표

/aaa, /bbb 이외의 URL로 호출되는 기본 ingress-nginx 404 페이지 변경.

 

 

3. Ken형이 샘플을 만들어 놓은것을 사용

# git clone https://github.com/kenmoini/custom-nginx-ingress-errors

 

 

4. 아래 경로에 내가 사용할 html 페이지지 넣기. 404.html

# cd ~/custom-nginx-ingress-errors/www

 

5. Docker 이미지 생성

#root@ubuntu-k8s-master01:/opt/custom-nginx-ingress-errors# docker build -t brightforest:1.0 .

Dockerfile
FROM quay.io/kubernetes-ingress-controller/custom-error-pages-amd64:0.4

COPY www /www

 

 

6. 이미지 Tag 변경

# docker tag brightforest:1.0 brightforest/ingress-custom-error:1.0

 

 

7. Docker Hub Registry에 Push

# docker push brightforest/ingress-custom-error:1.0

 

 

8. yml 파일로 deployment, svc 생성

# kubectl apply -f k8s-deployment.yaml

k8s-deployment.yml
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-errors
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: nginx-errors
    app.kubernetes.io/part-of: ingress-nginx
spec:
  selector:
    app.kubernetes.io/name: nginx-errors
    app.kubernetes.io/part-of: ingress-nginx
  ports:
  - port: 80
    targetPort: 8080
    name: http
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-errors
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: nginx-errors
    app.kubernetes.io/part-of: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: nginx-errors
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: nginx-errors
        app.kubernetes.io/part-of: ingress-nginx
    spec:
      containers:
      - name: nginx-error-server
        image: brightforest/ingress-custom-error:1.0    #이미지 수정
        #image: kenmoini/custom-nginx-ingress-errors:latest
        ports:
        - containerPort: 8080
        # Setting the environment variable DEBUG we can see the headers sent
        # by the ingress controller to the backend in the client response.
        # env:
        # - name: DEBUG
        #   value: "true"

 

 

9. 생성된 nginx-error 서비스 확인

root@ubuntu-k8s-master01:/opt/custom-nginx-ingress-errors# kubectl get all -n ingress-nginx | grep error
pod/nginx-errors-7dcc84df95-wl9qd               1/1     Running     0          81m
service/nginx-errors                         ClusterIP   10.233.51.243   <none>        80/TCP                       81m
deployment.apps/nginx-errors               1/1     1            1           81m
replicaset.apps/nginx-errors-7dcc84df95               1         1         1       81m

 

 

 

10. 에러페이지 연결

참고 사이트에서는 정석 방법대로 ConfigMap으로 nginx의 custom-http-errors 옵션을 사용하여 해당 에러 발생시 service/nginx-errors 를 호출하도록 함.

 

지금은 404 페이지만 적용하면 되니까 /aaa, /bbb가 아닌 모든 경로(/)로 호출이 될 경우만 ingress에 추가

ingress-sample.yml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress-sample
  namespace: ingress-nginx
  annotations:
  #nginx.ingress.kubernetes.io/custom-http-errors: "404"
  #nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  #- host: brightforest.com
  - http:
      paths:
      - path: /aaa
        backend:
          serviceName: my-nginx
          servicePort: 80
      - path: /bbb
        backend:
          serviceName: my-nginx2
          servicePort: 80
      - path: /
        backend:
          serviceName: nginx-errors
          servicePort: 80

 

 

11. 호출 확인

/aaa, /bbb가 아닌 url 호출로 제대로 적용이 되었는지 확인.

 

 

 

 

 

 

 

 

*nginx의 custom-http-errors 옵션 사용방법

1. ingress에 /aaa, /bbb 경로만 설정 된 경우. nginx-errors 서비스까지 동일하게 생성


2. ingress deployment 수정
root@ubuntu-k8s-master01:~# kubectl edit deployment.apps/ingress-nginx-controller -n ingress-nginx
...
containers:
- args:
  ...
  - --default-backend-service=$(POD_NAMESPACE)/nginx-errors #라인 추가
...


3. nginx 설정 변경하는 configmap 생성
root@ubuntu-k8s-master01:~# cat nginx-configuration.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
data:
  custom-http-errors: "404,500,503"


3. configmap 적용
root@ubuntu-k8s-master01:~# kubectl apply -f nginx-configuration.yaml


4. 호출 확인

*nginx-controller에 수정하면 10~20초뒤에 반영이 됨.
*테스트 구조는 ingress-nginx -> nginx 구조
   - custom-http-errors: "404"으로 설정할 경우 503페이지는 nginx의 기본 페이지가 리턴
   - custom-http-errors: "404,500,503" 으로 설정할 경우 ingress의 503 custom error 페이지가 리턴

 

 

참고.

https://dev.to/kenmoini/custom-kubernetes-ingress-default-backend-and-error-pages-3alh

Helm

  • Kubernetes Package Managing Tool
  • Kubernetes  패키지 배포를 위한 Tool
  • Chart라고 부르는 패키지 포멧을 사용
  • Chart는 쿠버네티스 리소스를 desribe하는 파일들의 집합
  • 특정 디렉토리 하위에 모여있는 파일들을 Chart라고 함.

 

 

구조

Client - 엔드유저를 위한 Command line Client

Server(Tiller) - in-cluster 서버로 chart의 배포, 릴리즈를 관리

 

 

 


 

 

#helm 최신 버전을 자동으로 가져와서 로컬에 설치하는 스크립트
root@ubuntu-k8s-master01:/opt#  curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
root@ubuntu-k8s-master01:/opt# chmod +x *.sh
root@ubuntu-k8s-master01:/opt# ./get_helm.sh

 

#tiller 서비스 account 생성
root@ubuntu-k8s-master01:/opt# kubectl -n kube-system create sa tiller
serviceaccount/tiller created




#tiller에 cluster-admin 롤 부여
kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
clusterrolebinding.rbac.authorization.k8s.io/tiller created

 

#버전 확인
root@ubuntu-k8s-master01:/opt# helm version
version.BuildInfo{Version:"v3.5.4", GitCommit:"1b5edb69df3d3a08df77c9902dc17af864ff05d1", GitTreeState:"clean", GoVersion:"go1.15.11"}



#차트 찾기 - 여러 저장소들에 있는 헬름 차트들을 포관하는 헬름 허브 검색
root@ubuntu-k8s-master01:/opt# helm search hub
root@ubuntu-k8s-master01:/opt# helm search hub -o json kubernetes-dashboard | jq



#차트 찾기 - [helm repo add]를 사용하여 로컬 헬름 클라이언트에 추가된 저장소들을 검색. 퍼블릭 네트워크 접속 필요없음.
root@ubuntu-k8s-master01:/opt# helm repo add stable https://charts.helm.sh/stable
root@ubuntu-k8s-master01:/opt# helm repo add bitnami https://charts.bitnami.com/bitnami
root@ubuntu-k8s-master01:/opt# helm search repo
root@ubuntu-k8s-master01:/opt# helm search repo stable
root@ubuntu-k8s-master01:/opt# helm search repo bitnami



#패키지 설치
root@ubuntu-k8s-master01:/opt# helm install sllee stable/tomcat
root@ubuntu-k8s-master01:/opt# helm install my-nginx bitnami/nginx



#상태 확인
root@ubuntu-k8s-master01:/opt# helm status sllee




*기타 설치 방법
helm install foo foo.0.1.1.tgz
helm install foo path/to/foo
helm install foo https://example.com/charts/foo-1.2.3.tgz

 

#차트 커스터마이징
#차트에 어떤 구성이 가능한지 확인
root@ubuntu-k8s-master01:/opt# helm show values stable/tomcat




#차트 옵션 변경
[--values] 옵션 : Override 할 YAML 파일을 지정
[--set] 옵션 : 명령줄 상에서 Override 지정
    ex) --set a=b
        --set servers[0].port=80
 (공식 문서 참고. https://helm.sh/ko/docs/intro/using_helm/)

 

#release 업그레이드
helm upgrade -f panda.yaml sllee stable/tomcat




#Release 롤백
helm rollback [RELEASE] [REVISION]
helm rollback sllee 1



#Revision 확인 (설치, 롤백, 업그레이드마다 리비전 번호 1씩 증가)
root@ubuntu-k8s-master01:/opt# helm history sllee
REVISION        UPDATED                         STATUS          CHART           APP VERSION     DESCRIPTION
1               Fri May  7 01:58:30 2021        superseded      tomcat-0.4.3    7.0             Install complete
2               Fri May  7 02:25:10 2021        deployed        tomcat-0.4.3    7.0             Upgrade complete




#Release 제거
root@ubuntu-k8s-master01:/opt# helm uninstall sllee
release "sllee" uninstalled



#설치된 차트 확인
root@ubuntu-k8s-master01:/opt# helm list
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
sllee   default         1               2021-05-07 04:06:28.803759344 +0000 UTC deployed        tomcat-0.4.3    7.0



#실패, 삭제된 릴리즈 포함 확인
root@ubuntu-k8s-master01:/opt# helm list --all

 

1. docker에서 insecure registries를 등록하는 방법

 

1.1 daemon.json 파일 생성방법

/etc/docker/daemon.json
{
        "insecure-registries" : ["192.168.56.100:5000","brightforest-test-deploy:5000"]
}

$systemctl daemon-reload

$systemctl restart docker

$docker info

  ..insecure registries 확인...

 

 

1.2 서비스에 옵션 넣는 방법

/lib/systemd/system/docker.service
...
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.56.100:5000
...

$systemctl daemon-reload

$systemctl restart docker

$docker info

  ..insecure registries 확인...

 

 

 

 

2. kubespray로 배포된 cluster에 적용(위 방법으론 설정이 안 됨)

kubespray로 cluster를 배포할 때, 아래와 같이 yml 파일에서 미리 설정을 할 수 있다.

kubespray/inventory/brightforest/group_vars/all/docker.yml
..
docker_insecure_registries:
   - brightforest-test-deploy:5000
   - 192.168.56.100:5000
...

 

cluster가 설치될 때 아래 경로의 파일을 생성되며,

새로 추가되는 registry를 넣어주고 docker를 재기동하면 된다.

/etc/systemd/system/docker.service.d/docker-options.conf
[Service]
Environment="DOCKER_OPTS= --iptables=false \
--insecure-registry=brightforest-test-deploy:5000 --insecure-registry=192.168.56.100:5000 \
 \
--data-root=/var/lib/docker \
--log-opt max-size=50m --log-opt max-file=5 \

 

 

 

 

이제 docker login을 해보자

docker login -u admin -p admin brightforest-test-deploy:5000

+ Recent posts