[KUBERNETES] 무중단배포 rolling update strategy


1. 개요

서비스 중단 없이 애플리케이션을 업데이트 하기 위해서, Kubernetes에서는 rolling update라는 기능을 지원합니다. 이 기능을 통해서 전체 Pod을 일시에 중단/업데이트 하는 것이 아니라, 한번에 n개씩 Pod을 순차적으로 업데이트할 수 있습니다. 이를 통해 서비스 중단 현상 없이 애플리케이션 버전 업데이트 및 롤백을 할 수 있습니다.


2. deployment 작성

  • back-end-rolling-deployment.yaml
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
    name: rolling-update-test
    spec:
    replicas: 3
    minReadySeconds: 10
    strategy:
      type: RollingUpdate
      rollingUpdate:
        maxSurge: 1
        maxUnavailable: 0
    template:
      metadata:
        labels:
          app: web-front-end
          department: group3
      spec:
        containers:
        - name: m-client-web
          image: skarl/client:latest
          env:
          - name: PORT_ARGS
            value: "--port=80"
          ports:
          - containerPort: 80
            name: web-port
            protocol: TCP
    

minReadySeconds : pod이 Ready 단계 부터 Available 단계 까지 식단 차이 시간을 설정하지 않으면 ready에서 곧바로 avaliable이 되고 순단 현상이 일어난다. 적절한 시간을 테스트하여 설정하는것이 좋다.

strategy.type : “Recreate” or “RollingUpdate”를 설정가능. 기본값은 “RollingUpdate”, Recreate의 경우 Pod가 삭제된 후 재생성

strategy.rollingUpdate.maxSurge : rolling update 중 정해진 Pod 수 이상으로 만들 수 있는 Pod의 최대 개수. 기본값은 25%

strategy.rollingUpdate.maxUnavailable : rolling update 중 unavailable 상태인 Pod의 최대 개수를 설정. rollgin update 중 사용할 수 없는 Pod의 최대 개수. 값은 0보다 큰 정수를 통해 Pod의 절대 개수 설정이 가능하고, “25%“와 같이 percentage 표현 가능 . maxUnavailable에서 percentage 계산은 rounding down(내림) 방식이며 기본값은 25% 이다. maxSurge와 maxUnavailable 값이 동시에 0이 될 수 없다.


3. 배포 테스트

  • 운영중인 상태

Alt text


  • rolling update 중인 상태

Alt text


  • update 완료 상태

Alt text


[KUBERNETES] nginx-ingress ssl 적용


1. secret 생성

1
kubectl create secret tls test-secret --key _test_SHA256WITHRSA.key --cert test_ssl.crt

2. ingress rule 수정

  • default-back-end-service.yaml
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: nginx-ingress
    namespace: default
    spec:
    tls:
    - hosts:
      - www.test.com
      - m.test.com
      secretName: test-secret
    rules:
    - host: [svc1 도메인]
      http:
        paths:
        - backend:
            serviceName: backend-svc-1
            servicePort: 80
    - host: [svc2 도메인]
      http:
        paths:
        - backend:
            serviceName: backend-svc-2
            servicePort: 80
    - host: [통합 도메인]
      http:
        paths:
        - path: /svc1
          backend:
            serviceName: backend-svc-1
            servicePort: 80
        - path: /svc2
          backend:
            serviceName: backend-svc-2
            servicePort: 80
        - path: /nginx_status
          backend:
            serviceName: nginx-ingress-nodeport
            servicePort: 18080
    

공유

알고리즘 연습문제


1. slice max

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/* 정수값을 가진 배열이 있을 때, 임의의 x,y,z 값을 정하고, 0<= x < y < z <= arr.length 라고 정의한다.
문제) a[x+1]에서 a[y-1] 사이의 값들과 a[y+1]에서 a[z-1] 사이의 값을 모두 더했을 때 최대값은 무엇인지 구하시오.
function slice(arr)
(3 <= arr.length <= 100,000)
(-10,000 <= n <= 10,000)

예를 들어 a = [3,2,6, -1,4,5, -1,2] 일 때,
(x=0, y=3, z=6) 일 때 a[1] + a[2] + a[4] + a[5] => 2 + 6 + 4 + 5 = 17,
(0, 3, 7) a[1] + a[2] + a[4] + a[5] + a[6] => 2 + 6 + 4 + 5 − 1 = 16,
(3, 4, 5) 사이 값이 없으므로 0.

따라서 최대값은 17이 된다. */

function slice_origin(arr){
var sum = 0 ;
// x = 0~ arr.length-3
// y = 1~ arr.length-2
// z = 2~ arr.length-1
for(var x=0; x<arr.length-3; x++){
for(var y=0; y<arr.length-2; y++){
for(var z=0; z<arr.length-1; z++){
if(x<y && y<z){
var temp_sum = sums(x,y,z,arr);
if(sum < temp_sum){
sum = temp_sum;
console.log("===");
console.log("sum"+sum);
console.log("===");
console.log(x,y,z);
console.log("===");
}
}
}
}
}
function sums(x,y,z,arr){
var sum = 0;
var xy = arr.slice(x+1,y);
for(var i=0; i<xy.length; i++){
sum += xy[i];
}
var yz = arr.slice(y+1,z);
for(var j=0; j<yz.length; j++){
sum += yz[j];
}
return sum;
}
}
var arr = [-3,-1,10,-6,-3,4,5,-1,-5,-1,5,4,1,-5,-1,-5,-11111,-2,0,-9,-10,14,1,-1];// [200,6,1,4,5,1,10,2,4,6,-100,-10000] ;
slice_origin(arr);

2. bracket

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* Visual Studio Code와 유사한 Editor+++라는 에디터가 있다.
Visual Studio Code에서는 괄호를 입력하면 자동으로 닫는 괄호가 입력되는 것처럼 Editor+++도 자동으로 괄호를 닫는다.
그런데 Editor+++는 가끔 버그로 인해 닫는 괄호를 늦게 다는 경우가 있다.

여기에 Editor+++에서 작성한 텍스트가 있는데 이 텍스트를 Visual Studio Code로 복사하고자 하는데
이 때 괄호가 올바른지 아래와 같이 검증하고자 한다.

예를 들어 (), {()} {()()} 처럼 입력할 때 닫는 괄호가 올바르게 표시되며 이는 올바른 형태이다.
그러나 ([)()] 의 경우 모두 쌍은 맞으나 괄호가 올바를 위치에 있지 않으므로 이는 올바르지 않은 형태이다.


문제) Editor+++에서 작성한 괄호값을 가진 임의의 텍스트가 있을 때, Visual Studio Code에서 인식이 가능한지 파악하고, 가능하면 true, 불가능하면 false를 출력하라. */
function bracket_replace(str){
var result = true;
if(str.length%2==1) return false;
var startlength = str.length;

do {
str = str.replace(/\(\)|\{\}|\[\]/g,'');
if(str.length==0) break;
if(str.length == startlength) result = false;
startlength=str.length;
} while (result);

return result;
}

3. count arr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 배열 A가 있다. 이 배열은 배열 B의 몇번째 위치에 값을 증가(++) 시켜야 하는지에 대한 정보를 담고 있다.
예를 들어 a = [3,4,4,5,1,4,4] 인 배열이 있다고 할 때,
a[0]= 3 이므로 배열의 3번째 값을 증가 시켜라 (0,0,1,0,0)
a[1]= 4 이므로 배열의 4번째 값을 증가 시켜라 (0,0,1,1,0)
a[2]= 4 이므로 배열의 4번째 값을 증가 시켜라 (0,0,1,2,0)
이 것을 반복하면 배열 B는 [1,0,1,4,1] 값을 갖는다. */
function count_arr(arr){
var max = arr.reduce( function (previous, current) {
return previous > current ? previous:current;
});
var return_arr = new Array(max);
return_arr.fill(0);

for(let val of arr){
return_arr[val-1] = return_arr[val-1]+1;
}
return return_arr;
}

4. quick sort

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Array.prototype.quickSort = function() {

var r = this;
if(this.length <= 1) {
return this;
}
var less = [], greater = [];

var pivot = r.splice(Math.floor(r.length / 2),1);
console.log("중간지점값:"+pivot);
// 중간값 기준 작은 값 or 큰 값
for (var i = r.length - 1 ; i >= 0; i--){
if ( r[i] <= pivot) {
less.push(r[i]);
} else {
greater.push(r[i]);
}
}
var c = [];

return c.concat(less.quickSort(), pivot, greater.quickSort());

};

var a = [3,1,43,5,123,6,231,0];
console.log(a.quickSort());

[KUBERNETES] nginx 컨테이너를 활용한 ingress load balancer 구성


1. 테스트용 웹 백엔드 생성

  • back-end-deployment.yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: deploy-test-1
    spec:
    replicas: 2
    template:
    metadata:
    labels:
    app: web-front-end
    department: group1
    spec:
    containers:
    - name: m-client-web
    image: xxx/client:latest
    env:
    - name: PORT_ARGS
    value: "--port=80"
    ports:
    - containerPort: 80
    name: web-port
    protocol: TCP
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: deploy-test-2
    spec:
    replicas: 2
    template:
    metadata:
    labels:
    app: web-front-end
    department: group2
    spec:
    containers:
    - name: tiny-webserver-2
    image: xxx/node-api:latest
    env:
    - name: PORT_ARGS
    value: "--port=3501"
    ports:
    - containerPort: 3501
    name: web-port
    protocol: TCP

  • back-end-service.yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    apiVersion: v1
    kind: Service
    metadata:
    name: backend-svc-1
    spec:
    ports:
    - port: 80
    protocol: TCP
    targetPort: web-port
    selector:
    app: web-front-end
    department: group1
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: backend-svc-2
    spec:
    ports:
    - port: 80
    protocol: TCP
    targetPort: web-port
    selector:
    app: web-front-end
    department: group2

  • 실행
    1
    2
    kubectl apply -f back-end-deployment.yaml
    kubectl apply -f back-end-service.yaml

2. 테스트용 ingress용 백엔드 생성

  • default-back-end-deployment.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: default-http-backend
    spec:
    replicas: 2
    template:
    metadata:
    labels:
    app: default-http-backend
    spec:
    terminationGracePeriodSeconds: 60
    containers:
    - name: default-http-backend
    # Any image is permissable as long as:
    # 1. It serves a 404 page at /
    # 2. It serves 200 on a /healthz endpoint
    image: gcr.io/google_containers/defaultbackend:1.0
    livenessProbe:
    httpGet:
    path: /healthz
    port: 8080
    scheme: HTTP
    initialDelaySeconds: 30
    timeoutSeconds: 5
    ports:
    - containerPort: 8080
    resources:
    limits:
    cpu: 10m
    memory: 20Mi
    requests:
    cpu: 10m
    memory: 20Mi
  • default-back-end-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: default-http-backend
spec:
  type: ClusterIP
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: default-http-backend

  • 실행
    kubectl apply -f default-back-end-deployment.yaml
    kubectl apply -f default-back-end-service.yaml
    

4. Nginx Ingress Controller 설정값 저장을 위한 Configmap 등록

  • configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: nginx-ingress-controller-conf
    labels:
      app: nginx-ingress-lb
      group: lb
    data:
    # for VTS page of the Nginx load balancer
    enable-vts-status: 'true'
    enable-sticky-sessions: 'true'
    

5. Nginx Ingress Controller 생성

  • SA, ClusterRole, ClusterRoleBinding
# Add: SA, ClusterRole, ClusterRoleBinding
# Name Space: default
apiVersion: v1
kind: ServiceAccount
metadata:
  name: ingress
  namespace: default

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: system:ingress
rules:
- apiGroups:
  - ""
  resources: ["configmaps","secrets","endpoints","events","services"]
  verbs: ["list","watch","create","update","delete","get"]
- apiGroups:
  - ""
  - "extensions"
  resources: ["services","nodes","ingresses","pods","ingresses/status"]
  verbs: ["list","watch","create","update","delete","get"]

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: ingress
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:ingress
subjects:
  - kind: ServiceAccount
    name: ingress
    # Could be like 'kube-system' ...
    namespace: default


  • deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  # Could be like 'kube-system' ...
  namespace: default
spec:
  replicas: 2
  revisionHistoryLimit: 3
  template:
    metadata:
      labels:
        app: nginx-ingress-lb
    spec:
      serviceAccountName: ingress
      terminationGracePeriodSeconds: 60
      containers:
        - name: nginx-ingress-controller
          image: gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.2
          imagePullPolicy: IfNotPresent
          readinessProbe:
            httpGet:
              path: /healthz
              port: 18080
              scheme: HTTP
          livenessProbe:
            httpGet:
              path: /healthz
              port: 18080
              scheme: HTTP
            initialDelaySeconds: 10
            timeoutSeconds: 5
          args:
            - /nginx-ingress-controller
            - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
            - --configmap=$(POD_NAMESPACE)/nginx-ingress-controller-conf
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - containerPort: 443
            - containerPort: 18080

5. Ingress Rule 디플로이

  • default-back-end-service.yaml
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: nginx-ingress
    namespace: default
    spec:
    rules:
    - host: [svc1 도메인]
      http:
        paths:
        - backend:
            serviceName: backend-svc-1
            servicePort: 80
    - host: [svc2 도메인]
      http:
        paths:
        - backend:
            serviceName: backend-svc-2
            servicePort: 80
    - host: [통합 도메인]
      http:
        paths:
        - path: /svc1
          backend:
            serviceName: backend-svc-1
            servicePort: 80
        - path: /svc2
          backend:
            serviceName: backend-svc-2
            servicePort: 80
        - path: /nginx_status
          backend:
            serviceName: nginx-ingress-nodeport
            servicePort: 18080
    

참고링크

Ingress Load Balancer 개념도

공유

[KUBERNETES] redis simple deployment 및 service 작성


1. deployment 및 service yaml 작성

  • deployment
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: redis-test
    spec:
    replicas: 1
    template:
    metadata:
    labels:
    app: redis
    spec:
    containers:
    - name: master
    image: redis
    resources:
    requests:
    cpu: 100m
    memory: 100Mi
    ports:
    - containerPort: 6379

  • service
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    apiVersion: v1
    kind: Service
    metadata:
    name: redis-test
    spec:
    selector:
    app: redis
    ports:
    - protocol: TCP
    port: 6379

공유

docker build & push to docker-hub


1. docker 이미지 추출

  • node.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    FROM node:9.4-alpine
    MAINTAINER authorize <xxx@gmail.com>
    #작업 디렉토리
    WORKDIR /src
    #원본 소스복사
    COPY ./freebex-integrated .
    # npm 설치
    RUN npm install
    #환경변수 NODE_ENV 의 값을 development 로 설정
    #ENV NODE_ENV development

    #오픈할 포트 multi: EXPOSE 80 3000
    EXPOSE 3501
    #CMD["npm","start"]
    CMD node ./bin/www

  • html on nginx
    1
    2
    3
    4
    5
    6
    #alpine image
    FROM nginx:alpine
    #create the server and location configuration
    COPY default.conf /etc/nginx/conf.d/default.conf
    #copies the build app to the default location
    COPY client/dist/mobile /usr/share/nginx/html

2. 이미지 빌드

1
docker build --rm -f Dockerfile -t [image-name]:latest .

3. 이미지 푸시(docker hub)

1
2
docker tag [image-name]:latest [docker-hub ID]/[image-name]:latest
docker push [docker-hub ID]/[image-name]:latest
공유

[KUBERNETES] dashboard 설치


1. dashboard,admin-rbac, heapster 설치

1
2
3
4
5
6
7
8
9
10
11
12
13
git clone https://github.com/DragOnMe/k8s-1.8-dashboard-heapster-mod.git
cd k8s-1.8.1-dashboard/
kubectl apply -f kubernetes-dashboard.yaml
kubectl apply -f kubernetes-dashboard-admin-rbac.yaml
cd ../
kubectl apply -f k8s-heapster/

[root@localhost k8s-1.8.1-dashboard]# kubectl get pods -nkube-system -w
NAME READY STATUS RESTARTS AGE
heapster-dfd674df9-k6vr7 1/1 Running 0 3d
kubernetes-dashboard-5bd6f767c7-2h6wv 1/1 Running 0 2d
monitoring-grafana-76848b566c-cts9n 1/1 Running 0 3d
monitoring-influxdb-6c4b84d695-d8j4t 1/1 Running 0 3d

kubernetes-dashboard.yaml 수정

  1. image 변경 (1.8.1 -> 1.8.3)
  2. service nodeport 설정
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     spec:
    containers:
    - name: kubernetes-dashboard
    image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
    //==========================================================

    kind: Service
    apiVersion: v1
    metadata:
    labels:
    k8s-app: kubernetes-dashboard
    name: kubernetes-dashboard
    namespace: kube-system
    spec:
    # Added NodePort
    type: NodePort
    ports:
    - port: 443
    targetPort: 8443
    # Added nodePort: 30000
    nodePort: 30000
    selector:
    k8s-app: kubernetes-dashboard

2. dashboard 접근 token 조회

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost]# kubectl -n kube-system get secret | grep kubernetes-dashboard-admin
kubernetes-dashboard-admin-token-mcx5k kubernetes.io/service-account-token
[root@localhost]# kubectl describe -nkube-system secret kubernetes-dashboard-admin-token-mcx5k
Name: kubernetes-dashboard-admin-token-mcx5k
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name=kubernetes-dashboard-admin
kubernetes.io/service-account.uid=1d1aa7aa-30c1-11e8-a365-002590a7058c

Type: kubernetes.io/service-account-token

Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsInR....중략...
FhyrXH_2ZZlAkYvm0oCT5VZMYCnKQ77NZEdyFXvZpsrXTA4BwfKyPFaFxUPKA

3. 서버local이 아닌 브라우저에서 접근하기위해 nginx수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 443;
server_name <접근호스트>;
ssl on;
ssl_certificate /etc/kubernetes/pki/ca.crt;
ssl_certificate_key /etc/kubernetes/pki/ca.key;

location / {
proxy_pass https://<master-ip>:30000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}

[KUBERNETES] install For CentOS


1. Docker, kubelet, kubeadm 설치(For CentOS7)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://yum.kubernetes.io/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
EOF

$ setenforce 0
$ systemctl disable firewalld && systemctl stop firewalld
$ yum install -y docker
$ yum install -y kubelet kubeadm kubectl kubernetes-cni
$ systemctl enable docker && systemctl restart docker
$ systemctl enable kubelet && systemctl restart kubelet
  • master 서버 AND cluster Node서버 동일설치

2. MASTER 서버 초기화

  • network add-on으로 flannel을 사용할 때는 ‘–pod-network-cidr’ 옵션이 필수이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ sudo kubeadm init --pod-network-cidr 10.244.0.0/16
.
.
.
생략
.
.
.
Your Kubernetes master has initialized successfully!

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
http://kubernetes.io/docs/admin/addons/

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

kubeadm join --token=872aa9.d7610d83eabce1a4 <master ip>
  • 초기화시 옵션 –kubernetes-version v1.9.2 –feature-gates CoreDNS=false

3. Master에서 Pod 수행(For TEST)

  • 기본적으로 클러스터는 보안 문제로 master에서 pod를 스케줄링 하지 않는다. 하지만, 예를 들어 테스트할때 노드가 부족하거나 단일 노드에서 개발 용으로 kubernetes 클러스터를 사용할 때, master에서 pod를 스케줄링하도록 명령할 수 있다.
1
$ kubectl taint nodes --all node-role.kubernetes.io/master-

4. pod network add-on 설치

  • 사용 가능한 network add-on 목록 중 하나를 선택한다. 클러스터 당 하나의 pod network만 설치할 수 있다. 각 network add-on 링크에 접속하면 설치 방법이 나와있다. ‘Weave Net’ 과 ‘Flannel’만이 멀티 플랫폼 환경(amd64, arm64, arhtp)을 지원한다.
1
2
3
export KUBECONFIG=/etc/kubernetes/admin.conf
sysctl net.bridge.bridge-nf-call-iptables=1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

5. Cluster Node Join

  • Master에서 Pod network설치가 완료되어 ‘kube-dns’가 Running 상태가 되었는지 확인한다.
1
2
3
4
5
6
7
8
9
10
11
$ kubectl get pods --namespace=kube-system
NAME READY STATUS RESTARTS AGE
etcd-localhost.localdomain 1/1 Running 0 3d
kube-apiserver-localhost.localdomain 1/1 Running 0 3d
kube-controller-manager-localhost.localdomain 1/1 Running 0 3d
kube-dns-6f4fd4bdf-x4k6t 3/3 Running 0 3d
kube-flannel-ds-c5l2w 1/1 Running 1 1d
kube-flannel-ds-fxknd 1/1 Running 2 3d
kube-proxy-dg7xd 1/1 Running 0 3d
kube-proxy-pmbsb 1/1 Running 0 1d
kube-scheduler-localhost.localdomain 1/1 Running 0 3d
  • node 서버가 접속하여 master init에서 나온 결과를 입력한다.
1
2
3
4
5
6
7
8
[root@node1]# kubeadm join --token 64dd18.cb6f66d53a1b8710  [master-ip]:6443 
--discovery-token-ca-cert-hash sha256:c5e8554a75dae6a7701dc12043cf6d2576842a4e360b24d38971fe0911c412ba

#마스터서버에서
[root@master1]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready master 3d v1.9.6
node1 Ready node 1d v1.9.6

6. 초기화 - RESET KUBERNETES(MASTER AND CLUSTER)

1
2
3
4
5
6
7
8
9
10
11
kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1

마크다운 문법

<헤더>

H1 = #
H2 = ##

H6 = ######

강조

이건 이탈릭체(기울이기)입니다.

이것도 이탈릭체(기울이기)입니다.

이건 볼드체(굵은 체)입니다.

이것도 볼드체(굵은 체)입니다.

이건 취소선입니다

을 같이 써 볼까요?

<블록 인용>

이렇게

이렇게

이렇게

구분선


가로선

리스트 표현방법

  • 플러스

  • – 하이픈

숫자리스트

  1. 숫자1
  2. 숫자2

링크

블로그

코드

무조건 빈줄을 하나 넣어줘 준 다음 공백 4개(” “) 로 시작하면 됩니다.

또는 “로 시작해서 “ 으로 끝내면 됩니다.

코드 안에서는 자동으로 escap 처리를 해줍니다.(<, > 등등)

리스트안에서 코드는 “` 로 해줘야 합니다.

var i = 0 “

1
2
3
4
5
6
7

'''javascript 코드를 적어주세요. 이렇게 하면 파이썬 문법에 맞게 코드를 예쁘게 보여줍니다.'''
var i = 0;
var j = 0;
function test(){

}

Create a new post

1
$ hexo new "My New Post"

More info: Writing

공유