[ dynamic volume 사용법 ]
1. pvc 에 storageclass 를 지정하여 pvc 만 생성하면 pv 가 다이너믹하게 생성되고 pvc 도 생성된다.
2. 이 때 rbd 이미지도 자동으로 생성된다.

$ vi jenkins-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins
  namespace: ci-infra
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
  storageClassName: ceph




[ static volume 사용법 ]
1. rbd 이미지를 수동으로 생성해야 한다.
2. pv 에 storageclass 와 rbd 값을 모두 넣어야 한다.
    pv 에 pvc 에서 pv 를 selector 로 찾을 수 있게 label 값을 넣어야 한다.
    (keyring 값은 안넣어도 됨, storageclass의 secret 이용)
3. pvc 에 storageclass 와 selector 나 volumeName 둘 중에 하나를 사용하여 pv 와 연결한다.
    (storageclass 는 값은 없어도 됨.  없으면 default 인 storageclass 값을 활용함)


$ vi jenkins-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins
  labels:
    app: jenkins
spec:
  capacity:
    storage: 100Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: ceph
  rbd:
    image: jenkins
    monitors:
    - 192.168.30.23:6789
    - 192.168.30.24:6789
    - 192.168.30.25:6789
    pool: kubes
    secretRef:
      name: ceph-secret-user
    user: kube


$ vi jenkins-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins
  namespace: ci-infra
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
  storageClassName: ceph
  selector:
    matchLabels:
      app: jenkins
# volumeName: jenkins


$ vi jenkins-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jenkins
  namespace: ci-infra
  labels:
    app: jenkins
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: cicd-services
                operator: In
                values:
                - enabled
      securityContext:
        runAsUser: 1000
        fsGroup: 1000
      containers:
      - name: master
        env:
        - name: JENKINS_OPTS
          value: "--httpsPort=0 --http2Port=0"
        - name: JAVA_OPTS
          value: "-Xms8G -Xmx8G -XX:+UseG1GC -XX:+ExplicitGCInvokesConcurrent -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=20 -XX:+UnlockDiagnosticVMOptions -XX:G1SummarizeRSetStatsPeriod=1 -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Seoul"
        image: jenkins/jenkins:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        - containerPort: 50000
          name: jnlp
          protocol: TCP
        readinessProbe:
          httpGet:
            path: /login
            port: 8080
          periodSeconds: 10
          timeoutSeconds: 5
          successThreshold: 2
          failureThreshold: 5
        volumeMounts:
        - mountPath: /var/jenkins_home
          name: jenkins
#        resources:
#          limits:
#            cpu: 4000m
#            memory: 8000Mi
#          requests:
#            cpu: 1000m
#            memory: 8000Mi
      volumes:
      - name: jenkins
        persistentVolumeClaim:
          claimName: jenkins




## 생성
$ rbd create kubes/jenkins -s 100G
$ kubectl create -f jenkins-pv.yaml
$ kubectl create -f jenkins-pvc.yaml

$ kubectl create -f jenkins-deployment.yaml 


저작자 표시 변경 금지
신고
Posted by Kubernetes Korea co-leader seungkyua@gmail.com

## Install OpenVPN

# apt-get update
# apt-get install openvpn easy-rsa

## Set Up the CA Directory (using easy-rsa)
# make-cadir /etc/openvpn/ease-rsa
# cd /etc/openvpn/ease-rsa

## Configure the CA Variables
# vi vars
export KEY_COUNTRY="KR"
export KEY_PROVINCE="Seoul"
export KEY_CITY="Jongno"
export KEY_ORG="OpenStackKR"
export KEY_EMAIL="root@localhost"
export KEY_OU="OpenStack KR"
export KEY_NAME="server"

## Build the Certificate Authority
# source vars
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key
.....................................................+++
...................+++
writing new private key to 'ca.key'
-----
Country Name (2 letter code) [KR]:
State or Province Name (full name) [Seoul]:
Locality Name (eg, city) [Jongno]:
Organization Name (eg, company) [OpenStackKR]:
Organizational Unit Name (eg, section) [OpenStackKR]:
Common Name (eg, your name or your server's hostname) [OpenStackKR CA]:
Name [server]:
Email Address [root@localhost]:


## Create the Server Certificate, Key, and Encryption Files
# ./build-key-server server

A challenge password []:               --> 그냥 엔터
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


# ./build-dh
# openvpn --genkey --secret keys/ta.key


## Generate a Client Certificate and Key Pair
# cd /etc/openvpn/ease-rsa
# source vars
./build-key seungkyua
Generating a 2048 bit RSA private key
.....+++
.................+++
writing new private key to 'seungkyua.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KR]:
State or Province Name (full name) [Seoul]:
Locality Name (eg, city) [Jongno]:
Organization Name (eg, company) [OpenStackKR]:
Organizational Unit Name (eg, section) [OpenStackKR]:
Common Name (eg, your name or your server's hostname) [seungkyua]:
Name [server]:
Email Address [root@localhost]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []: OpenStackKR
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'KR'
stateOrProvinceName   :PRINTABLE:'Seoul'
localityName          :PRINTABLE:'Jongno'
organizationName      :PRINTABLE:'OpenStackKR'
organizationalUnitName:PRINTABLE:'OpenStackKR'
commonName            :PRINTABLE:'seungkyua'
name                  :PRINTABLE:'server'
emailAddress          :IA5STRING:'root@localhost'
Certificate is to be certified until Aug 29 01:42:22 2027 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated



## Configure the OpenVPN Service
# cd /etc/openvpn/ease-rsa/keys
# cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
# gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf

# vi /etc/openvpn/server.conf
32 port 1194
35 proto tcp
78 ca ca.crt
79 cert server.crt
80 key server.key

141 push "route 192.168.30.0 255.255.255.0"
142 push "route 192.168.230.0 255.255.255.0"
143 push "route 192.168.130.0 255.255.255.0"
144 push "route 192.168.49.0 255.255.255.0"
145 push "route 192.168.51.0 255.255.255.0"
146 push "route 192.168.54.0 255.255.255.0"

205 push "dhcp-option DNS 192.168.30.26"    # 사설 DNS 서버가 설치될 서버 IP
206 push "dhcp-option DNS 8.8.8.8"
208 push "dhcp-option DOMAIN cicd.seungkyua"   # 사설 DNS 도메인

250 tls-auth ta.key 0
256 cipher AES-128-CBC   # AES
259 auth SHA256
275 user nobody
276 group nogroup


## Adjust the Server Networking Configuration
# vi /etc/sysctl.conf
28 net.ipv4.ip_forward=1

# sysctl -p

# ip route | grep default
# iptables -t nat -A POSTROUTING -s 10.8.0.0/8 -o br-ex -j MASQUERADE



## Start and Enable the OpenVPN Service
# systemctl start openvpn@server
# systemctl status openvpn@server
# systemctl enable openvpn@server


## Create Client Configuration Infrastructure
# cd /etc/openvpn
# mkdir -p /etc/openvpn/client-configs/files
# chmod 700 /etc/openvpn/client-configs/files
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client-configs/base.conf

# vi client-configs/base.conf
36 proto tcp
42 remote server_ip 1194
61 user nobody
62 group nogroup
88 #ca ca.crt
89 #cert client.crt
90 #key client.key
113 cipher AES-128-CBC
114 auth SHA256
115 key-direction 1


# vi client-configs/make_config.sh
#!/bin/bash

# First argument: Client identifier

KEY_DIR=/etc/openvpn/ease-rsa/keys
OUTPUT_DIR=/etc/openvpn/client-configs/files
BASE_CONFIG=/etc/openvpn/client-configs/base.conf

cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn


# chmod 700 client-configs/make_config.sh

# cd /etc/openvpn/client-configs

## seungkyua.ovpn 파일이 /etc/openvpn/client-configs/files 디렉토리 밑에 생성됨
# ./make_config.sh seungkyua



## 사용자 추가 시 클라이언트 파일 만드는 법

# cd /etc/openvpn/ease-rsa
# source vars
# ./build-key seungkyua

# cd /etc/openvpn/client-configs
# ./make_config.sh seungkyua


## server reboot 시 체크
# ip route | grep default

# iptables -t nat -A POSTROUTING -s 10.8.0.0/8 -o br-ex -j MASQUERADE



출처 : https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-16-04






## Install Bind on the DNS Server
# sudo apt-get update
# apt-get install unbound


## config 설정
# cd /etc/unbound
# vi unbound.conf.d/root-auto-trust-anchor-file.conf
server:
    verbosity: 1
    statistics-interval: 0
    statistics-cumulative: no
    extended-statistics: yes
    num-threads: 2

        interface: 192.168.30.26
        interface: 127.0.0.1

    outgoing-range: 4096
    outgoing-port-permit: 40000-44096
    cache-max-ttl: 3600
    do-ip4: yes
    do-ip6: no

    access-control: 10.8.0.0/24 allow
    access-control: 192.168.30.0/24 allow
    access-control: 192.168.54.0/24 allow

    chroot: ""
    username: "unbound"
    directory: "/etc/unbound"
    log-time-ascii: yes
    pidfile: "/var/run/unbound/unbound.pid"
    hide-identity: yes
    hide-version: yes
    harden-short-bufsize: yes
    harden-large-queries: yes
    harden-glue: yes
    harden-dnssec-stripped: yes
    harden-below-nxdomain: yes
    harden-referral-path: yes
    use-caps-for-id: yes
    unwanted-reply-threshold: 10000000
    prefetch: yes
    prefetch-key: yes
    rrset-roundrobin: yes
    minimal-responses: yes
#    trusted-keys-file: /etc/unbound/keys.d/*.key
    auto-trust-anchor-file: "/var/lib/unbound/root.key"
    val-clean-additional: yes
    val-permissive-mode: no
    val-log-level: 1
    key-cache-size: 512m

    include: /etc/unbound/local.d/*.conf

# Remote control config section.
remote-control:
    control-enable: yes
    server-key-file: "/etc/unbound/unbound_server.key"
    server-cert-file: "/etc/unbound/unbound_server.pem"
    control-key-file: "/etc/unbound/unbound_control.key"
    control-cert-file: "/etc/unbound/unbound_control.pem"

# Stub and Forward zones
# include: /etc/unbound/conf.d/*.conf



## dns 설정
# mkdir -p local.d
# vi local.d/cicd.seungkyua.conf
local-zone: "cicd.stg.taco." static
local-data: "master01.cicd.seungkyua. IN A 192.168.30.13"
local-data: "node01.cicd.seungkyua. IN A 192.168.30.12"
local-data: "node02.cicd.seungkyua. IN A 192.168.30.17"
local-data: "node03.cicd.seungkyua. IN A 192.168.30.18"
local-data: "node04.cicd.seungkyua. IN A 192.168.30.21"

local-data: "centos-repo.cicd.seungkyua. IN A 192.168.30.12"
local-data: "dashboard.cicd.seungkyua. IN A 192.168.30.12"
local-data: "grafana.cicd.seungkyua. IN A 192.168.30.12"
local-data: "horizon.cicd.seungkyua. IN A 192.168.30.12"
local-data: "jenkins.cicd.seungkyua. IN A 192.168.30.12"
local-data: "keystone.cicd.seungkyua. IN A 192.168.30.12"
local-data: "kibana.cicd.seungkyua. IN A 192.168.30.12"
local-data: "minio.seungkyua. IN A 192.168.30.12"
local-data: "pypi-repo.cicd.seungkyua. IN A 192.168.30.12"
local-data: "registry.cicd.seungkyua. IN A 192.168.30.12"
local-data: "scope.cicd.seungkyua. IN A 192.168.30.12"
local-data: "prometheus.cicd.seungkyua. IN A 192.168.30.12"
local-data: "ubuntu-repo.cicd.seungkyua. IN A 192.168.30.12"



## start unbound
# systemctl restart unbound.service

# systemctl enable unbound.service 



출처 : https://calomel.org/unbound_dns.html



## reload unbound server with new configuration

# unbound-control reload






저작자 표시 변경 금지
신고
Posted by Kubernetes Korea co-leader seungkyua@gmail.com

Youtube 동영상

영문 스트립트


지금부터 나와 주변 사람들에게 물어야 할 인생의 다섯 가지 중요한 질문을 소개합니다.

My final suggestion is that there are five truly essential questions that you should regularly ask yourself and others.

거창할지 모르지만 이해해주길 바랍니다. 졸업 축사이니까.

My claim is that, this is slightly outlandish as a claim but this is a graduation speech.

이 질문을 하는 습관을 들이면 성공적이고 행복한 삶을 살며 마지막의 보너스 질문에 '네'라고 자신 있게 답할 수 있습니다.

if you get in the habit of asking these questions, you have a very good chance of being both successful and happy,

and you will be in a good position to answer “I did” to the bonus question at the end.


1.잠깐만요, 뭐라고요? (Wait, What?)

첫 번째 질문은 우리 아이가 좋아하는 질문이자 십대들이 특히 자주 하고 우리들도 곧잘 하는 질문입니다.

The first is a question my own kids are fond of asking, and it’s one you may have heard other teenagers pose — or maybe you still pose it yourself.

질문이 고전적입니다. '잠깐만요, 뭐라고요?'

The question is the classic, 'Wait, what?'

'잠깐만, 뭐라고?' 또는 '잠깐만요, 뭐?'라고 하기도 합니다.

It could be asked is 'Wait, What?' or 'Wait, What?' (둘의 억양이 다름)

우리 아이들은 보통 내가 집안일을 시키려 할 때 이 질문을 합니다.

My kids typically pose this question when I get to the point in a conversation where I’m asking them to do a chore or two.

아이들 입장에선 내 말이 이렇게 들립니다. "어쩌구... 저쩌구... 내일 아침에 방 좀 치워라!"

From their perspective, they hear me saying something like: "blah, blah, blah, blah, and then I’d like you to clean your room."

바로 그 순간에 아이들은 묻습니다. "잠깐만요, 뭐라고요, 뭘 치우라고요?"

And at that precise moment, the question inevitably comes: "Wait, what? Clean what?"

'잠깐만, 뭐라고?'는 사실 무언가를 명확히 하기위한 매우 효과적인 질문으로, 이해를 위해 필수적입니다.

"Wait what" is actually a very effective way of asking for clarification, which is crucial to understanding.

결론을 내리기 전과 결정을 하기 전에 물어야만 하는 질문입니다.

It’s the question you should ask before drawing conclusions or before making a decision.

하바드 학장인 라케시 쿠라나는 훌륭한 마스터클래스를 진행하며 지지에 앞서 질의의 중요성을 강조했습니다.

The Dean of Harvard College, Rakesh Khurana, gave a great master class this year, where he emphasized the importance of inquiry before advocacy.

어떤 의견을 반대하거나 지지하기 전에 상황과 개념을 이해하는 것이 중요합니다.

It’s important to understand an idea before you advocate for or against it.

'뭐라고요?' 전에 오는 '잠깐만요'는 진정으로 이해할 수 있도록 잠시 시간을 갖게 하는 좋은 알람입니다.

The wait, which precedes the what, is also a good reminder that it pays to slow down to make sure you truly understand.


2. 나는 궁금한데요? (I wonder...)

두 번째 질문은 '나는 궁금한데요?'입니다. 이 질문은 왜 그런지(wonder why)와 할 수 있는지(wonder if)가 이어집니다.

The second question is "I wonder" which can be followed by "why" or "if". So I wonder why, or I wonder if.

'왜 그런지'라는 질문은 이 세상에 호기심을 갖게 합니다. '할 수 있는지'라는 질문은 세상이 더 나아지도록 하는 방법을 생각하게 합니다.

Asking 'I wonder why' is the way to remain curious about the world, and asking 'I wonder if' is the way to start thinking about how you might improve the world.

다음과 같이, 나는 왜 미국의 학교가 인종적으로 분리되어 있는지 궁금했습니다. 우리가 이 상황을 바꿀 수 있을 지 궁금했습니다.

As in, I wonder why our schools are so segregated, and I wonder if we could change this?

나는 왜 학생들이 학교생활을 지루해 하는지 궁금했습니다. 학생들이 집중할 수 있는 수업을 만들 수 있는지 궁금했습니다.

Or I wonder why students often seem bored in school, and I wonder if we could make their classes more engaging?


3. 적어도... 할 수 있지 않을까? (Couldn't we at least?)

세 번째 질문은 '적어도... 할 수 있지 않을까요?'입니다.

The third question is: "Couldn’t we at least...?"

이 질문은 보통 우리가 꽉 막힌 곳에서 빠져나올 때 유용합니다. 의견 차를 넘어 합의에 도달할 때 유용합니다.

This is the question to ask that will enable you to get unstuck, as they say. It’s what enables you to get past disagreement to some consensus,

다음과 같이, 우리가 주장하는 교육 전략은 다르다 해도 학생들의 복지가 최우선이라는 건 동의하지 않나요?

as in, couldn’t we at least agree that we all care about the welfare of students, even if we disagree about strategy?

또한 일의 결과를 확신하지 못하더라도 일단 무언가를 시작할 때 유용합니다.

It’s also a way to get started when you’re not entirely sure where you will finish,

다음과 같이, 적어도 모든 학생들이 잘 먹고 건강하게 학교에 다닐 수 있는 기회를 주는 것을 시작해야 하지 않나요?

as in, couldn’t we at least begin by making sure that all kids have the chance to come to school healthy and well-fed?


4. 내가 어떻게 도울까? (How can I help?)

내 번째 질문은 '내가 어떻게 도울까?'입니다.

The fourth question is: "How can I help?"

여러분은 누군가를 돕고 싶어 교육대학원에 들어왔을 겁니다.

You are at HGSE, I presume, because you are interested in helping others.

하지만 여기서 구원자 증후군, 당신이 누군가를 구원하는 전문가이고 영웅이라는 태도에 대해 인식하게 되었을 겁니다.

But you also know, from your time here, to be aware of the savior complex, of the stance where you are the expert or hero who swoops in to save others.

우리는 구원자 증후군 때문에 가장 인간적인 본능인 타인에게 손을 내미는 본능을 버려서는 안 됩니다.

We shouldn’t let the real pitfalls of the savior complex extinguish one of the most humane instincts there is — the instinct to lend a hand.

하지만 어떻게 돕느냐가 더 중요할 수 있습니다.

But how we help matters as much as that we do help,

"어떻게 도울까?"라고 묻는 것은 도움의 방향을 겸손하게 묻는 것이며,

and if you ask "how you can help", you are asking, with humility, for direction.

그들이 자기 삶의 전문가이자 당신이 돕는 만큼 그들도 당신을 도울 수 있다는 사실을 깨닫게 합니다.

And you are recognizing that others are experts in their own lives and that they will likely help you as much as you help them.


5. 무엇이 가장 중요한가? (What truly matters?)

다섯 번째 질문은 '무엇이 가장 중요한가?'입니다.

The fifth question is this: "What truly matters?"

여러분도 적절한 질문이라 생각할 것입니다.

You can tack on "to me" as appropriate.

이 질문은 문제의 핵심과 믿음과 신념의 핵심으로 들어가게 해주는 질문입니다.

This is the question that forces you to get to the heart of issues and to the heart of your own beliefs and convictions.

매년 새해 결심에 추가하거나 대신할 수도 있는 질문입니다.

Indeed, it’s a question that you might add to, or substitute for, New Year’s resolutions.

새해 첫날 내게 무엇이 진정 중요한가 물을 수 있습니다.

You might ask yourself, in other words, at least every new year: what truly matters to me?

이것이 다섯 개의 중요한 필수 질문입니다.

So these are the five essential questions.


'잠깐만요, 뭐라고요?'는 모든 이해의 근원입니다.

"Wait, what" is at the root of all understanding.

'궁금해'는 모든 호기심의 근원입니다.

"I wonder" is at the heart of all curiosity.

'우리가 적어도... 할 수 있지 않을까?'는 모든 진전의 시작입니다.

"Couldn’t we at least" is the beginning of all progress.

'어떻게 도울 수 있을까?'는 모든 좋은 관계의 기본입니다.

"How can I help" is at the base of all good relationships.

'무엇이 가장 중요한가?'는 삶의 핵심으로 들어가게 해줍니다.

And "what really matters" gets you to the heart of life.

이 질문을 정기적으로, 특히 마지막 질문을 자주 한다면 보너스 질문에 답할 좋은 위치에 서게 됩니다.

If you ask these questions regularly, especially the last one, you will be in a great position to answer the bonus question,

이것은 생의 마지막에서 여러분이 만나게 될 가장 중요한 질문입니다.

which is, at the end of the day, the most important question you’ll ever face.

이 보너스 질문은 여러 버전이 있으며, 이전에 한 버전은 확실히 들었을 것입니다.

This bonus question is posed in many ways, and you have surely heard a version of it before.

나에게 가장 강렬한 한 문장으로 다가온 것은 레이먼드 카버의 시 <만년의 조각글>에서 였습니다.

To me, the single best phrasing of this question is in a poem by Raymond Carver, called "Late Fragments".

그가 쓴 마지막 시입니다.

It’s one of the last poems he wrote.

지난 9월 나의 법대 동기이자 가장 사랑하는 친구였던 더그 켄들의 장례식에서 이 문장을 만났습니다.

I came across it recently on the very sad occasion of a memorial service for one of my dearest and closest friends, my former law school roommate Doug Kendall,

51세라는 너무 젊은 나이에 세상을 떠난 친구입니다.

who died in September at the far too young age of 51.

이 시는 그의 장례식 식순 뒤에 적혀 있었습니다. 시는 질문으로 시작하는데 이것이 바로 나의 보너스 질문에 해당합니다.

The poem was printed on the back of the program for his memorial and it starts with this question, what I’m calling the bonus question.

'그럼에도 불구하고 당신은 이 삶에서 원하는 것을 얻었습니까?'

"And did you get what you wanted out of life, even so?"


그럼에도 불구하고 이 부분이, 나에게는, 긴 인생과 삶의 희망에서 피할 수 없는 고통과 실망을 완벽하게 잡아냈다고 생각합니다.

The "even so" part of this, to me, captures perfectly the recognition of the pain and disappointment that inevitably make up a full life, but also the hope that life,

또한 '그럼에도 불구하고' 우리 인생에 행복과 만족의 가능성이 함께 함을 이야기합니다.

even so, offers the possibility of joy and contentment.

당신이 '잠깐만요, 뭐라고요?, 나는 궁금한데요?, 적어도 할 수 있지 않을까?, 어떻게 도울까?, 무엇이 가장 중요한가?' 이 질문을 주기적으로 한다면,

My claim is that if you regularly ask: wait, what, I wonder, couldn’t we at least, how can I help, and what really matters,

'마지막 그럼에도 불구하고 당신은 삶에서 원하는 것을 얻었는가?'라는 질문에 '네'라고 대답할 수 있을 것입니다.

when it comes time to ask yourself "And did you get what you wanted out of life, even so", your answer will be "I did".

이 시는 '그럼에도 불구하고 원하는 것을 얻었는가?'라는 질문에 '그렇다'라고,

So the poem asks "And did you get what you wanted out of life, even so",

또 "당신은 무엇을 원했습니까?"에 "이 지상에서, 나를 사랑받는 사람이라 부를 수 있고, 사랑받고 있다고 느끼는 것"이라고 답합니다.

and then continues: "I did. And what did you want?", "To call myself beloved. To feel beloved on the earth.".

사랑을 받는다는 건 지극히 사랑받는다는 것 뿐 아니라 소중히 여겨지고 존경받는 것입니다.

The word "beloved" is important here as it not only means dearly loved, but also cherished and respected.


이제 나의 축사가 거의 끝나가고 있으니 한 가지만 당부합니다.

And while I promise I’m very near the end of my speech, let me just say that

이 시를 읽으며 학생들을 생각할 수밖에 없었습니다.

when I read these lines, it’s hard for me not to think about students.

우리는 이곳은 물론 다른 곳에서 우리가 가르치는 학생들의 실력을 어떻게 향상시킬까를 항상 고민해야 합니다.

We spend a lot of time, here and elsewhere, thinking about how we might improve student performance, which is how it should be.

학생들이 공부를 잘할 뿐만 아니라 사랑받고 있다고 느낀다면 모든 학교와 이 세상은 보다 나은 곳이 될 것입니다.

Yet I can’t help but think that schools, and indeed, the world, would be better places if students didn’t simply perform well but also felt beloved

모든 학생들은 선생님께 사랑받고 친구들에게 사랑받아야 합니다.

- beloved by their teachers and by their fellow classmates.

이제 축사를 마무리하며 여러분에게 마지막 인사를 전합니다.

To tie this all together into one slightly misshapen package, and to bid you a final farewell.

이제 대학원을 떠나 여러분을 절실히 필요로 하는 넓은 세상에 나아갈 여러분에게 나의 소망과 신념을 꼭 전하고 싶습니다.

As you leave Appian Way and head into a world that desperately needs you, let me express my sincere hope and belief that

좋은 질문을 하고, 듣기를 멈추지 않는다면 여러분 자신이 이 지상에서 사랑받고 있다고 느낄 것이며,

if you never stop asking and listening for good questions, you will feel beloved on this earth,

마찬가지로, 다른 사람들 특히 여러분의 학생들이 사랑받는다고 느끼게 해줄 수 있습니다.

and, just as importantly, you will help others, especially students, feel the same.

감사합니다.

Thank you very much.





저작자 표시 변경 금지
신고
Posted by Kubernetes Korea co-leader seungkyua@gmail.com






저작자 표시 변경 금지
신고
Posted by Kubernetes Korea co-leader seungkyua@gmail.com

OpenStack Day Korea 2017 에서 발표한 자료




저작자 표시 변경 금지
신고
Posted by Kubernetes Korea co-leader seungkyua@gmail.com

## OpenStack Foundation 사용자 등록



## launchpad 에 사용자 등록 (OpenStack Foundation email 과 동일해야 함)

## launchpad.net 사용자 id 확인 (자신의 id 로 조회되는지 확인)
https://launchpad.net/~seungkyua


## review 사이트에 사용자 등록


## review 사이트에서 필요한 정보 등록
1. Profile 메뉴에서 Username 등록
2. Contact Information 에서 아래 처럼 날짜 업데이트 되었는지 확인 (안되어 있으면 정보 입력)
   Contact information last updated on May 25, 2015 at 12:51 PM.
3. SSH Public Keys 등록
   $ cat ~/.ssh/id_rsa.pub
4. Agreements 서명





[ stackalytics 에 추가 ]
$ mkdir -p ~/Documents/git && cd ~/Documents/git
$ git clone ssh://seungkyu@review.openstack.org:29418/openstack/stackalytics
$ cd stackalytics


## git 및 git-review 설치
$ brew install git git-review


## 환경 설정 (gitreview.username 은 review 사이트의 Profile Username 임)
$ git config --add gitreview.username "seungkyu"
git config --add user.name "Seungkyu Ahn"
git config --add user.email "seungkyua@gmail.com"




## 접속 테스트 및 commit-msg hook 다운로드
$ git review -s




## 개인 추가 (launchpad_id 의 abc 순), end_date: null 은 하나 밖에 못씀
## launchpad_id 만 필수, 나머지 id 는 옵션
$ git checkout -b seungkyua
$ vi etc/default_data.json
        {
            "launchpad_id": "seungkyua",
            "gerrit_id": "seungkyu",
            "github_id": "seungkyua",
            "companies": [
                {
                    "company_name": "Samsung SDS",
                    "end_date": "2015-Feb-28"
                },
                {
                    "company_name": "OpenStack Korea User Group",
                    "end_date": "2016-Dec-31"
                },
                {
                    "company_name": "SK telecom",
                    "end_date": null
                }
            ],
            "user_name": "Seungkyu Ahn",
            "emails": ["ahnsk@sk.com", "seungkyua@gmail.com"]
        },




## companies 항목에 회사명이 없을 때는 추가해야 함
25785         {
25786             "domains": ["sktelecom.com"],
25787             "company_name": "SK telecom",
25788             "aliases": ["SKT", "SKTelecom"]
25789         },



$ git commit -a

## commit message 는 아래와 같이
modify personal info about seungkyua


## commit message 작성법
첫번째 라인은 50자 이내로 간단히 요약을 쓴다.
[공백라인]
설명을 적되 라인은 72자가 넘어가면 다음 라인에 쓴다.



## review 올리기
$ git review



## git review 시 Change-Id 세팅 에러가 나면 화면 에러 대로 수행
$ gitdir=$(git rev-parse --git-dir); scp -p -P 29418 seungkyu@review.openstack.org:hooks/commit-msg ${gitdir}/hooks/

$ git commit --amend
$ git review


## 확인










저작자 표시 변경 금지
신고
Posted by Kubernetes Korea co-leader seungkyua@gmail.com

ip link 로 device 를 namespace 로 보내면 Host 에서 해당 device 는 볼 수 가 없다.

이를 다시 Host 로 원복하는 방법



## Host 서버의 eno2 를 qrouter namespace 에 넣고 ip 세팅
$ sudo ip netns
qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc
qdhcp-03a6de58-9693-4c41-9577-9307c8750141

## eno2 를 네임스페이스로 보내기
$ sudo ip link set eno2 netns qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc
$ sudo ip netns exec qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc ip a
4: eno2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 3c:a8:2a:20:ed:d1 brd ff:ff:ff:ff:ff:ff

$ sudo ip netns exec qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc ip addr add 192.168.130.100/24 dev eno2
$ sudo ip netns exec qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc ifconfig eno2 up



## qrouter namespace 에 있는 eno2 를 Host 로 다시 돌려 보내기

$ ip netns exec qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc ip link set eno2 netns 1










저작자 표시 변경 금지
신고
Posted by Kubernetes Korea co-leader seungkyua@gmail.com
## https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/cephfs

[ ceph-admin 노드에서 ]
$ ssh ceph@192.168.30.22

## kubes Pool 생성
$ ceph osd pool create kubes 128

## kube user 생성
$ ceph auth get-or-create client.kube mon 'allow r' \
osd 'allow class-read object_prefix rbd_children, allow rwx pool=kubes'


[client.kube]
    key = AQCt/BpYigJ7MRAA5vy+cl39EsKpY3C+tXEGrA==

## kube user 에 대한 secret key 생성 및 조회
$ ceph auth get-or-create client.kube
AQCt/BpYigJ7MRAA5vy+cl39EsKpY3C+tXEGrA==


## kube-node01, kube-node02 서버에 kube key 와 ceph.conf 추가
$ ssh stack@192.168.30.15 sudo mkdir -p /etc/ceph
$ ceph auth get-or-create client.kube | ssh stack@192.168.30.15 sudo tee /etc/ceph/ceph.client.kube.keyring
$ cat /etc/ceph/ceph.conf | ssh stack@192.168.30.15 sudo tee /etc/ceph/ceph.conf
$ ssh stack@192.168.30.15 sudo chown -R stack.stack /etc/ceph

$ ssh stack@192.168.30.16 sudo mkdir -p /etc/ceph
$ ceph auth get-or-create client.kube | ssh stack@192.168.30.16 sudo tee /etc/ceph/ceph.client.kube.keyring
$ cat /etc/ceph/ceph.conf | ssh stack@192.168.30.16 sudo tee /etc/ceph/ceph.conf
$ ssh stack@192.168.30.16 sudo chown -R stack.stack /etc/ceph



[ kube-node01, kube-node02 에 접속 ]
## ceph rbd client (ceph-common) 와 ceph fs client 설치 (ceph-fs-common)
$ sudo apt-get -y install ceph-common ceph-fs-common



########################################
## ceph rbd 로 연결하는 방식
########################################

## https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/rbd
## https://github.com/ceph/ceph-docker/tree/master/examples/kubernetes

[ ceph-admin 노드에서 ]

## kube keyring 파일 넣기
$ sudo vi /etc/ceph/ceph.client.kube.keyring
[client.kube]
    key = AQCt/BpYigJ7MRAA5vy+cl39EsKpY3C+tXEGrA==


## rbd 이미지 생성
## http://karan-mj.blogspot.kr/2013/12/ceph-installation-part-3.html

$ rbd create ceph-rbd-test --pool kubes --name client.kube --size 1G -k /etc/ceph/ceph.client.kube.keyring

$ rbd list --pool kubes --name client.kube -k /etc/ceph/ceph.client.kube.keyring
$ rbd -p kubes ls


## Jewel 의 새기능은 현재 대부분의 OS 에서 mount 문제가 있어 image 기능을 제거 해야 함
$ rbd feature disable ceph-rbd-test fast-diff --pool kubes --name client.kube -k /etc/ceph/ceph.client.kube.keyring
$ rbd feature disable ceph-rbd-test deep-flatten --pool kubes --name client.kube -k /etc/ceph/ceph.client.kube.keyring
$ rbd feature disable ceph-rbd-test object-map --pool kubes --name client.kube -k /etc/ceph/ceph.client.kube.keyring
$ rbd feature disable ceph-rbd-test exclusive-lock --pool kubes --name client.kube -k /etc/ceph/ceph.client.kube.keyring

$ rbd info ceph-rbd-test --pool kubes --name client.kube -k /etc/ceph/ceph.client.kube.keyring
$ rbd --image ceph-rbd-test -p kubes info

$ rbd remove ceph-rbd-test --pool kubes --name client.kube -k /etc/ceph/ceph.client.kube.keyring


## secret yaml 을 만들기 위해 key 를 base64 로 인코딩 함
$ grep key /etc/ceph/ceph.client.kube.keyring |awk '{printf "%s", $NF}'|base64
QVFDdC9CcFlpZ0o3TVJBQTV2eStjbDM5RXNLcFkzQyt0WEVHckE9PQ==




[ kube-deploy 접속 ]

## secret key 를 pod 로 생성하여 접속
$ vi ~/kube/ceph-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
data:
  key: QVFDdC9CcFlpZ0o3TVJBQTV2eStjbDM5RXNLcFkzQyt0WEVHckE9PQ==

$ scp ~/kube/ceph-secret.yaml kube-master01:~/kube/.
$ ssh kube-master01 "kubectl create -f ~/kube/ceph-secret.yaml"
$ kubectl -s http://kube-master01:8080 get secrets


## rbd-with-secret pod 생성해서 rbd 활용
$ vi ~/kube/rbd-with-secret.yml
apiVersion: v1
kind: Pod
metadata:
  name: rbd2
spec:
  containers:
  - image: gcr.io/google_containers/busybox
    command:
    - sleep
    - "3600"
    imagePullPolicy: IfNotPresent
    name: rbd-rw-busybox
    volumeMounts:
    - mountPath: "/mnt/rbd"
      name: rbdpd
  volumes:
  - name: rbdpd
    rbd:
      monitors:
      - 192.168.30.23:6789
      - 192.168.30.24:6789
      - 192.168.30.25:6789
      pool: kubes
      image: ceph-rbd-test
      user: kube
      keyring: /etc/ceph/ceph.client.kube.keyring
      secretRef:
        name: ceph-secret
      fsType: ext4
      readOnly: false


$ scp ~/kube/rbd-with-secret.yml kube-master01:~/kube/.
$ ssh kube-master01 "kubectl create -f ~/kube/rbd-with-secret.yml"
$ kubectl -s http://kube-master01:8080 get pods




## rbd 연결 확인
$ kubectl -s http://kube-master01:8080 describe pods rbd2
$ kubectl -s http://kube-master01:8080 exec -it rbd2 -- df -h



[ kube-node02 접속하여 ]

$ docker ps
$ docker inspect --format '{{ .Mounts }}' 4c4070a1393b

## 혹은
$ mount |grep kub
/dev/rbd0 on /var/lib/kubelet/plugins/kubernetes.io/rbd/rbd/kubes-image-ceph-rbd-test type ext4 (rw,relatime,stripe=1024,data=ordered)
/dev/rbd0 on /var/lib/kubelet/pods/061973fc-a265-11e6-940f-5cb9018c67dc/volumes/kubernetes.io~rbd/rbdpd type ext4 (rw,relatime,stripe=1024,data=ordered)




[ kube-deploy 접속해서 ]

## secret key pod 를 사용하지 않고 keyring 으로만 rbd pod 생성
$ vi ~/kube/rbd.yml
apiVersion: v1
kind: Pod
metadata:
  name: rbd
spec:
  containers:
  - image: gcr.io/google_containers/busybox
    command:
    - sleep
    - "3600"
    imagePullPolicy: IfNotPresent
    name: rbd-rw-busybox
    volumeMounts:
    - mountPath: "/mnt/rbd"
      name: rbdpd
  volumes:
  - name: rbdpd
    rbd:
      monitors:
      - 192.168.30.23:6789
      - 192.168.30.24:6789
      - 192.168.30.25:6789
      pool: kubes
      image: ceph-rbd-test
      user: kube
      keyring: /etc/ceph/ceph.client.kube.keyring
      fsType: ext4
      readOnly: false


$ scp ~/kube/rbd.yml kube-master01:~/kube/.
$ ssh kube-master01 "kubectl create -f ~/kube/rbd.yml"
$ kubectl -s http://kube-master01:8080 get pods

## rbd 연결 확인

$ kubectl -s http://kube-master01:8080 exec -it rbd -- df -h 


저작자 표시 변경 금지
신고
Posted by Kubernetes Korea co-leader seungkyua@gmail.com


저작자 표시 변경 금지
신고
Posted by Kubernetes Korea co-leader seungkyua@gmail.com

kubernetes 의 Authentication 과 Authorization 활용


[ Authentication ]

  • client-ca-file 로 접속
  • static password file 사용
  • static token file 사용
  • OpenStack Keystone 사용
먼저 client-ca-file 은 Authorization 을 사용할 수 없으니 제외

static password 도 잘됨, 그러나 Authorization 을 연동해 보지는 않았음.

OpenStack Keystone 연계는 아직 알파버전이고 수정이 자주 일어나서 아직 소스까지 볼 단계는 아니라 생략.

static token 방식은 Authorization 과도 잘 연동되므로 이걸 활용



## uuid generate

$ cat /proc/sys/kernel/random/uuid



## {{uuid}} 는 위에서 제너레이션 된 값으로 대치

$ sudo vi /etc/default/kube-token

{{uuid}},admin,1

{{uuid}},ahnsk,2,"tfabric,group1"

{{uuid}},stack,3,tfabric



## api 서버에 token file 옵션 추가

$ sudo chown stack.root /etc/default/kube-token

--token-auth-file=/etc/default/kube-token \


$ sudo systemctl restart kube-apiserver.service


$ kubectl -s https://kube-master01:6443 --token={{uuid}} get node





[ Authorization ]

  • ABAC Mode
  • RBAC Mode
RBAC 는 아직 알파라 베타인 ABAC 를 활용

## 전체 admin : admin,   tfabric admin : ahnsk,      tfabric readOnly user : stack
kubectl 이 api version 을 체크하기 때문에 무조건 nonResourcePath 도 all 로 지정해야 함

$ sudo vi /etc/default/kube-rbac.json
{"apiVersion":"abac.authorization.kubernetes.io/v1beta1","kind":"Policy","spec":{"user":"system:serviceaccount:kube-system:default","namespace":"*","resource":"*","apiGroup":"*", "nonResourcePath": "*"}}
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user":"admin", "namespace": "*", "resource": "*", "apiGroup": "*", "nonResourcePath": "*" }}
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user":"ahnsk", "namespace": "tfabric", "resource": "*", "apiGroup": "*", "nonResourcePath": "*" }}
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user":"stack", "namespace": "tfabric", "resource": "*", "apiGroup": "*", "readonly": true, "nonResourcePath": "*"}}



kube-system 이 kube-apiserver 에 접근하기 위해서는 1라인이 반드시 있어야 함





$ sudo vi /etc/default/kube-apiserver

--authorization-mode=ABAC \

--authorization-policy-file=/etc/default/kube-rbac.json \


$ sudo systemctl restart kube-apiserver.service




$ cd ~/kube

$ vi busybox-tfabric.yaml

apiVersion: v1

kind: Pod

metadata:

  name: busybox

  namespace: tfabric

spec:

  containers:

  - image: gcr.io/google_containers/busybox

    command:

      - sleep

      - "3600"

    imagePullPolicy: IfNotPresent

    name: busybox

  restartPolicy: Always



$ kubectl -s https://kube-master01:6443 --token={{uuid}} --v=8 version


token 지정을 매번 하기 귀찮으니 config context 를 활용하는 것이 좋음.

이건 다음에....















저작자 표시 변경 금지
신고
Posted by Kubernetes Korea co-leader seungkyua@gmail.com