kubernetes와 spinnaker를 설치 사용

kubernetes 설치

1개의 마스터 서버 (centos 7) 2개의 노드 서버 (centos 7) 1개의 미니오 스토리지 서버,registry (centos 7)

아이피는 다음과 같습니다.

IP Name
192.168.0.195 master
192.168.0.192 node192
192.168.0.193 node193
192.168.0.194 node194(minio storage, docker registry)

테스트랩 준비

centos7을 4대의 서버에 설치한다.

kubernetes를 설치하기전 해야할 일이 있습니다.

https://kubernetes.io/docs/setup/independent/install-kubeadm/#before-you-begin

문서를 참고하시면되는데요 진행해보겠습니다.

저는 root로 로그인하여 진행하였습니다.

before you begin kubernetes

# 기본 프로그램 설치
yum update && yum -y install kernel-headers kernel-devel
yum install net-tools wget git -y # ifconfig git wget를 설치합니다.

# selinux off
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# firewall off
systemctl disable firewalld

# docker install
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
systemctl start docker
systemctl enable docker

curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

modprobe br_netfilter
  • host 파일 설정
vi /etc/hosts
> 192.168.0.195 master
> 192.168.0.192 node192
> 192.168.0.193 node193
> 192.168.0.194 node194
  • swap off
swapoff -a # 임시로 swap off 재부팅시 살아남.
vi /etc/fstab  # swap을 지우기

kubernetes package install

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl start kubelet
systemctl enable kubelet
exit

exit

이렇게 하면 kubernetes설치까지 마무리 된것이다.

node192 node193 을 위와 똑같이 만듭니다.(ansible을 사용하면 편리합니다.)

node 194

  • minio storage : daemon mode , spinnaker 에서 필요한 데이터를 저장하는 저장소 역할을 합니다. s3등을 사용하여도 되나 여기서는 vm에 하드디스크에 저장합니다.
  • docker registry : docker - docker private registry 2
  • halyard : spinnaker installer - docker
mkdir -p /data/auth # registry 인증 정보 저장
mkdir -p /data/docker # docker-compose 위치
mkdir -p /data/registry # docker image 저장위치
mkdir -p /data/minio # minio file 저장 위치
mkdir -p /data/minio-config # minio 설정 저장위치
mkdir -p /data/docker/registry # registry docker compose
mkdir -p /data/docker/halyard # halyard docker compose
mkdir -p /data/halyard # halyard 설정 저장위치
mkdir -p /data/kube # master config파일을 복사해둘 위치 halyard에서 이 파일을 참조해서 기본 설정을 만들기 때문

minio

cd
wget https://dl.minio.io/server/minio/release/linux-amd64/minio
chmod +x minio
mv minio /usr/local/bin/minio
minio server --address ":9001" --config-dir /data/minio-config /data/minio

Endpoint:  http://192.168.0.194:9001  http://172.17.0.1:9001  http://127.0.0.1:9001
AccessKey: OS2PVUL53ZTSNOWOWR
SecretKey: kLP1IdRqS+WWOXjrq80LptXy+j9SoeqXRLs

화면에 Access key와 secret key가 보인다 복사해두고 다음 커맨들를 사용하자.

ctrl+c로 멈춘다.

이제 데몬으로 띄워서 항상 동작하게 한다.

cat <<EOT >> /etc/default/minio
# Volume to be used for Minio server.
MINIO_VOLUMES="/data/minio/"
# Use if you want to run Minio on a custom port.
MINIO_OPTS="--address :9001"
# Access Key of the server.
MINIO_ACCESS_KEY=6K3MW29PYQHC4W39E03D
# Secret key of the server.
MINIO_SECRET_KEY=kuOkqn3y6UKvHvC0DgoLyb+fDstDJFZV3NBwtZ1

EOT

# Download minio.service in /etc/systemd/system/
( cd /etc/systemd/system/; curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service )

vi /etc/systemd/system/minio.service # user와 그룹을 수정한다. 난 루트를 사용
User=root
Group=root

systemctl start minio
systemctl enable minio

http://localhost:9001 으로 확인한다. 파일도 넣어보고 폴더도 만들어보기 바란다.

private repositry 실행

https://teamsmiley.github.io/2018/12/22/docker-private-registry/

여기를 참고하셔도 됩니다.

registry ssl 추가

yum install epel-release python-pip  python-virtualenv -y
easy_install pip
pip install requests urllib3 pyOpenSSL --force --upgrade

cd /tmp
git clone https://github.com/certbot/certbot.git
cd certbot

./certbot-auto certonly \
--manual \
--preferred-challenges=dns \
--email teamsmiley@gmail.com \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos \
--debug \
--no-bootstrap \
-d registry.publishapi.com

_acme-challenge.registry txt 형태로 도메인에 등록요청

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.registry.publishapi.com with the following value:

r6hQID8GMkcW9ibu--vGVAZdENS01Qeu4GmfbV5OoMY

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

도메인관리 사이트에 접속하여 이 레코드를 추가합니다. 엔터는 아직 치시면 안됩니다.

저장하고 난후 조금 기다립니다. 그후 터미널로 들어와서 엔터를 칩니다.

잘 생성되었습니다.

registry 유저 생성

docker run \
  --entrypoint htpasswd \
  registry -Bbn USERNAME PASSWORD > /data/auth/htpasswd

registry 실행

vi /data/docker/registry/docker-compose.yml
---
version: '3.3'
services:
  registry:
    container_name: 'registry'
    restart: always
    image: registry
    privileged: true
    ports:
      - 5000:5000
    environment:
      TZ: 'America/Los_Angeles'
      REGISTRY_AUTH: htpasswd
      REGISTRY_STORAGE_DELETE_ENABLED: 'true'
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data/registry
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_HTTP_TLS_CERTIFICATE: /etc/letsencrypt/live/registry.publishapi.com/fullchain.pem
      REGISTRY_HTTP_TLS_KEY: /etc/letsencrypt/live/registry.publishapi.com/privkey.pem
    volumes:
      - /data/registry:/data/registry
      - /data/letsencrypt:/etc/letsencrypt
      - /data/auth:/auth
cd /data/docker/registry && docker-compose up -d

init kubenetes - master

echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
kubeadm init --apiserver-advertise-address 192.168.0.195 --pod-network-cidr 10.1.0.0/16

결과값을 잘 복사해두자. 나중에 이 값을 이용해서 노드를 마스터에 연결해준다.

You can now join any number of machines by running the following on each node
as root:

kubeadm join 192.168.0.195:6443 --token mcwwrn.12whl3ln7wxeoj2l --discovery-token-ca-cert-hash sha256:db16581f1259e99adbc2450a7e009835781aaa1a365d6abe762514075ac4485f
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

네트워크를 적용해야 하는데 weave를 적용해보자.

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
> serviceaccount/weave-net created
> clusterrole.rbac.authorization.k8s.io/weave-net created
> clusterrolebinding.rbac.authorization.k8s.io/weave-net created
> role.rbac.authorization.k8s.io/weave-net created
> rolebinding.rbac.authorization.k8s.io/weave-net created
> daemonset.extensions/weave-net created

네트워크관련 내용이 생성되었다.

이제 노드랑 연결을 해보자.

node를 마스터에 조인

위에 복사해둔 스크립트를 노드에 실행을 해준다.

echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
echo '1' > /proc/sys/net/ipv4/ip_forward

kubeadm join 192.168.0.195:6443 --token mcwwrn.12whl3ln7wxeoj2l --discovery-token-ca-cert-hash sha256:db16581f1259e99adbc2450a7e009835781aaa1a365d6abe762514075ac4485f

클러스터 연결 확인

master 에서 노드가 붙었는지 확인할 필요가 있다.

$ kubectl get nodes
NAME      STATUS     ROLES    AGE     VERSION
master    Ready      master   6m51s   v1.13.0
node192   NotReady   <none>   15s     v1.13.0
node193   NotReady   <none>   12s     v1.13.0

계속확인하여 node가 ready상태로 변경될때가지 대기

not ready가 오래되면 다음처럼 한다.

노드 상태를 확인해보자.

kubectl describe nodes node192
kubectl describe nodes node193

kubenetes 기본 구조 공부

namespace

pod

replicaset

service

deploy

kubectl 사용법

  • get
  • describe
  • logs
  • delete
  • apply
kubectl get nodes
# default namespace의 pods를 보여줌
kubectl get pods
# 전체 네임스페이스에 대해서 볼수 있음
kubectl get pods --all-namespaces
kubectl get pods -o wide             # 더 많은 정보를 볼수있다. 어느노드에서 pod가 실행중인지 알수 있음
kubectl get pods --all-namespaces -w # w는 watch 계속 업데이트해준다.
kubectl get pods hello-pod           # 특정 포드를 볼수 있음

# pod의 로그를 보고싶은경우
kubectl logs hello-pod

# replica set을 보고싶은경우
kubectl get replicaset

# services를 보고 싶은경우
kubectl get services
# deployment가 보고 싶은 경우
kubectl get deployment

# yml을 읽어서 pod service replicaset등을 쿠버네티스에 생성한다.
kubectl create -f pod.yml
kubectl apply -f pod.yml

# pod의 자세한 설정으로 보고싶다.
kubectl describe pods hello-pod

kubectl delete pods/hello-pod
kubectl delete replicationcontrollers/auth-server
kubectl delete svc auth-server-svc

# 추가 예제
kubectl get all --all-namespaces

kubectl get pods --all-namespaces
kubectl get services --all-namespaces
kubectl get deploy --all-namespaces
kubectl get pv --all-namespaces
kubectl get pvc --all-namespaces
kubectl get rc --all-namespaces
kubectl get replicasets --all-namespaces
kubectl get secret --all-namespaces

kubectl delete pods --all
kubectl delete services --all
kubectl delete deploy --all
kubectl delete pv --all
kubectl delete pvc --all
kubectl delete rc --all
kubectl delete replicasets --all
kubectl delete secret --all

yml 생성 (pod , service)를 만들어야한다. 마스터에서

cd /data/git/kube
vi hello-node.yml
---
apiVersion: v1
kind: Pod
metadata:
  name: hello-node
  labels:
    service-name: hello-node
spec:
  containers:
    - name: hello-node
      image: asbubam/hello-node
      readinessProbe:
        httpGet:
          path: /
          port: 8080
      livenessProbe:
        httpGet:
          path: /
          port: 8080

---
apiVersion: v1
kind: Service # service생성
metadata:
  name: hello-node
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 30100
  selector:
    service-name: hello-node

실습 해보자.

# kubectl get pods 명령으로 Pod list를 조회해보면 아직 아무것도 없다.
$ kubectl get pods
No resources found.

# kubectl create -f {yaml 파일명} 으로 Pod을 생성한다.
$ kubectl create -f hello-node.yml
pod "hello-node" created
service "hello-node" created

# kubectl get pods 결과에 1개의 Pod이 생성되고 있음을 확인할 수 있다.
$ kubectl get pods
NAME         READY     STATUS              RESTARTS   AGE
hello-node   0/1       ContainerCreating   0

# Pod이 정상적으로 실행되면 잠시 후에 아래와 같이 STATUS가 Running으로 update된다.
$ kubectl get pods
NAME         READY     STATUS    RESTARTS   AGE
hello-node   1/1       Running   0          13s

# pod의 자세한 내용을 본다.
$ kubectl describe pods hello-node

# localhost:8080에 접속해서 Hello World! 가 출력됨을 확인한다.
$  curl http://192.168.0.192:30100
Hello World!

pod

하나의 pod에 여러개의 컨테이너를 넣을수 있다. pod안에서는 스토리지도 공유가 서로 가능하다. 도커컨테이너. 일반적으로는 하나의 컨테이너만 넣는듯.

서비스

컨테이너는 클러스터 내에서 꺼지고 켜지고 하면서 아이피가 바뀌고 갯수가 바뀌기도 하고 한다. 그래서 컨테이너에 직접 접속하게 설정을 하면 언제 아이피가 바뀔지 모르니 안됨.

서비스를 만드어서 외부에는 서비스를 오픈하고 서비스가 내부 pod를 연결해주는 구조로 되어있다.

service type은 다음중 하나 고를수 있다.

  • NodePort
  • ClusterIP
  • LoadBalancer

위 예제에서는 nodeport로 오픈하고 있는것을 알수 있다.

kubectl get svc -o wide
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE    SELECTOR
hello-node   NodePort    10.103.218.93   <none>        8080:30001/TCP   6m9s   service-name=hello-node
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          38m    <none>

node port

nodeport는 전체 노드에 특정 포트 (30000–32767)를 외부에 오픈한다.

그러므로 다음 두 커맨드는 모두 동작한다.

curl http://192.168.0.192:30100
curl http://192.168.0.193:30100

클러스터의 모든 서버 아이피에 포트를 연다.

외부에 오픈하기는 가장 쉬운 방법 - 단점도 있다 포트가 30000번이상, 2개의 다른 서비스에 하나의 포트를 사용할수 없다. 전체 클러스터에 포트를 열기 때문

ClusterIP

clusterip가 기본값이다. 처음에는 이걸 왜 쓰냐고 생각햇는데 내부 서비스끼리 연결될때 이걸 사용한다.

예를 들면 워드프레스와 mysql 두개의 서비스가 돌고 잇을때 mysql은 외부에 오픈할 필요없이 워드프레스 pod에만 연결이 되면 되므로 mysql 서비스를 만들어서 cluster ip로 하면된다.

dns를 이용하여 내부적으로 이름만 가지면 아이피를 찾아서 연결해준다.

Load Balance

이것은 외부에서 아이피를 매핑해주는것으로 볼수 있다. 아마존이나 구글 클라우드는 자동으로 되는데 여기서는 베어메탈이므로 metallb라는 로드발란스를 설치를 해서 테스트해볼수 있다.

MetalLB 설치

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml

# 로그를 잘 보기 바란다. 대충 이런것들이 생긴다 정도는 파악해야한다.
> namespace/metallb-system created
> serviceaccount/controller created
> serviceaccount/speaker created
> clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
> clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
> role.rbac.authorization.k8s.io/config-watcher created
> clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
> clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
> rolebinding.rbac.authorization.k8s.io/config-watcher created
> daemonset.apps/speaker created
> deployment.apps/controller created

설정을 하자

vi metallb-ConfigMap.yml

---
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: my-ip-space
      protocol: layer2
      addresses:
      - 192.168.0.0/24

서비스에 줄 아이피를 정해뒀다 사용 가능한 아이피는 192.168.0.81 - 192.168.0.94 가 된다. 적용해보자.

kubectl create -f  metallb-ConfigMap.yml
# 상태를 확인해보자.
kubectl get pods -n metallb-system
kubectl logs -l component=speaker -n metallb-system
kubectl get svc -n metallb-system

이제 metallb-nginx.yml을 수정해서 loadbalance로 변경해보자.

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1
          ports:
            - name: http
              containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
kubectl create -f metallb-nginx.yml
kubectl  get svc

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.106.215.59   <pending>     8080:30001/TCP   9s
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          74m

type이 loadbalancer로 바귀었고 external-ip가 pending인것을 알수 있다.

외부 아이피를 받을때까지 대기한다. ( 3분이 넘어가면 뭐가 잘못된것이므로 다시 해본다.)

$ kubectl  get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
hello-node   LoadBalancer   10.110.182.246   192.168.0.80   8080:30001/TCP   4s
kubernetes   ClusterIP      10.96.0.1        <none>         443/TCP          77m

외부 아이피를 잘 받았다. 이제 이 아이피를 호출해보면된다.

curl http://192.168.0.80

metallb 삭제하고 싶으면 다음처럼 하면된다.

kubectl delete -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml
kubectl delete -f metallb-ConfigMap.yml
kubectl get configmap -n metallb-system
kubectl get svc -n metallb-system

kube dashboard

install

기본 템플릿을 다운받아서 로컬에서 서비스 타입을 로드발란스로 바꿔서 실행해보자.

vi kubernetes-dashboard.yaml
---
# ------------------- Dashboard Secret ------------------- #

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs
  namespace: kube-system
type: Opaque

---
# ------------------- Dashboard Service Account ------------------- #

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system

---
# ------------------- Dashboard Role & Role Binding ------------------- #

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kubernetes-dashboard-minimal
  namespace: kube-system
rules:
  # Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret.
  - apiGroups: ['']
    resources: ['secrets']
    verbs: ['create']
    # Allow Dashboard to create 'kubernetes-dashboard-settings' config map.
  - apiGroups: ['']
    resources: ['configmaps']
    verbs: ['create']
    # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
  - apiGroups: ['']
    resources: ['secrets']
    resourceNames: ['kubernetes-dashboard-key-holder', 'kubernetes-dashboard-certs']
    verbs: ['get', 'update', 'delete']
    # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
  - apiGroups: ['']
    resources: ['configmaps']
    resourceNames: ['kubernetes-dashboard-settings']
    verbs: ['get', 'update']
    # Allow Dashboard to get metrics from heapster.
  - apiGroups: ['']
    resources: ['services']
    resourceNames: ['heapster']
    verbs: ['proxy']
  - apiGroups: ['']
    resources: ['services/proxy']
    resourceNames: ['heapster', 'http:heapster:', 'https:heapster:']
    verbs: ['get']

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-dashboard-minimal
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard-minimal
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kube-system

---
# ------------------- Dashboard Deployment ------------------- #

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      containers:
        - name: kubernetes-dashboard
          image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.0
          ports:
            - containerPort: 8443
              protocol: TCP
          args:
            - --auto-generate-certificates
            # Uncomment the following line to manually specify Kubernetes API server Host
            # If not specified, Dashboard will attempt to auto discover the API server and connect
            # to it. Uncomment only if the default does not work.
            # - --apiserver-host=http://my-address:port
          volumeMounts:
            - name: kubernetes-dashboard-certs
              mountPath: /certs
              # Create on-disk volume to store exec logs
            - mountPath: /tmp
              name: tmp-volume
          livenessProbe:
            httpGet:
              scheme: HTTPS
              path: /
              port: 8443
            initialDelaySeconds: 30
            timeoutSeconds: 30
      volumes:
        - name: kubernetes-dashboard-certs
          secret:
            secretName: kubernetes-dashboard-certs
        - name: tmp-volume
          emptyDir: {}
      serviceAccountName: kubernetes-dashboard
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
        - key: node-role.kubernetes.io/master
          effect: NoSchedule

---
# ------------------- Dashboard Service ------------------- #

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: LoadBalancer
  loadBalancerIP: 192.168.0.81
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
kubectl apply -f kubernetes-dashboard.yaml

> secret/kubernetes-dashboard-certs created
> serviceaccount/kubernetes-dashboard created
> role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
> rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
> deployment.apps/kubernetes-dashboard created
> service/kubernetes-dashboard created

kubectl get svc -n kube-system
> NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)         AGE
> kube-dns               ClusterIP      10.96.0.10      <none>         53/UDP,53/TCP   98m
> kubernetes-dashboard   LoadBalancer   10.107.42.182   192.168.0.81   443:32134/TCP   13s

외부 아이피 할당받았다 확인하자

https://192.168.0.81

계정 추가

vi kubernetes-dashboard-admin.yaml

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: admin-user
    namespace: kube-system

적용하자

kubectl apply -f kubernetes-dashboard-admin.yaml
> serviceaccount/admin-user created
> clusterrolebinding.rbac.authorization.k8s.io/admin-user created

다음 명령을 이용해 Token을 알아내자.

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

토큰을 넣고 signin하면 로그인이 된다.

노드들에 cpu사용량들을 확인할수도 있으면 여러가지 편의 기능이 있다.

네임스페이스 선택후 pod를 선택하면 상단 메뉴중 exec 라는것이 잇는데 이것을 누르면 컨테이너에 접속하여 shell을 실행할수 있는 웹사이트가 뜬다 . 가끔 임시로 쓰기는 좋아보임.

mysql 서비스 설치하기 (namespace 꼭 사용하기)

kubernetes를사용할때는 꼭 namespace를 쓰기를 추천드립니다.

kubectl create namespace dev
kubectl create namespace prod
kubectl get namespaces

mysql은 pv,pvc생성 » pod 생성 » 서비스 생성 이런식으로 됩니다.

Create Local Persistent Volumes (on master)

mkdir -p /data/git/kube
cd /data/git/kube
vi dev-mysql-pv-pvc.yml
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: dev-mysql-pv-volume
  namespace: dev
  labels:
    type: local
spec:
  storageClassName: slow
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: '/data/dev-mysql'
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - node192 #호스트이름이 192번인 노드에 /data/dev-mysql이라고 만들어라.
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dev-mysql-pv-claim
  namespace: dev
spec:
  storageClassName: slow
  selector:
    matchLabels:
      type: local
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
vi dev-mysql.yml
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: dev
spec:
  type: LoadBalancer
  loadBalancerIP: 192.168.0.82
  ports:
    - port: 3306
      targetPort: 3306
  selector:
    app: mysql
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: mysql
  namespace: dev
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - image: mysql:5.6
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: password
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-persistent-storage
          persistentVolumeClaim:
            claimName: mysql-pv-claim
kubectl create -f dev-mysql-pv-pvc.yml
kubectl create -f dev-mysql.yml
kubectl get pods --all-namespaces
kubectl get services --all-namespaces

Node192 번에 /data/dev-mysql폴더가 없으면 만들어 줘야한다.

여기에 데이터를 저장하게 해두었으나 실제로는 nfs등에 저장하면될듯

개발디비여서 외부에서 접속할 필요가 있으면 loadbalancer 를 서비스 타입으로 사용하나 서비스 디비는 외부에 오픈될 필요가 없으면 cluseterip를 사용해도 될듯 싶다.

teamsmiley's profile image

teamsmiley

2018-12-19 00:00

Read more posts by this author