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 OpenStack Korea 부대표 Seungkyu Ahn(seungkyua@gmail.com






저작자 표시 변경 금지
신고
Posted by OpenStack Korea 부대표 Seungkyu Ahn(seungkyua@gmail.com

OpenStack Day Korea 2017 에서 발표한 자료




저작자 표시 변경 금지
신고
Posted by OpenStack Korea 부대표 Seungkyu Ahn(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 OpenStack Korea 부대표 Seungkyu Ahn(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 OpenStack Korea 부대표 Seungkyu Ahn(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 OpenStack Korea 부대표 Seungkyu Ahn(seungkyua@gmail.com


저작자 표시 변경 금지
신고
Posted by OpenStack Korea 부대표 Seungkyu Ahn(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 OpenStack Korea 부대표 Seungkyu Ahn(seungkyua@gmail.com

## https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt


보통 cpu.cfs_period_us 는 cpu.cfs_quota 와 같이 사용되어 계산되는데 계산법은 다음과 같다. (단위 : microsecond)

1 CPU 사용률 = cpu.cfs_quota_us / cpu.cfs_period_us * 100

cgoup에서 1cpu 의 20% 를 사용한다면 아래와 세팅하면 된다.

# echo 10000 > cpu.cfs_quota_us /* quota = 10ms */
# echo 50000 > cpu.cfs_period_us /* period = 50ms */


Kubernetes 에선 limit resources 로 cpu 와 memory 를 다음과 같이 할당하다.
--limits='cpu=200m,memory=512Mi'

cpu 는 200m 로 할당하였는데 이는 cpu.cfs_period_us 값으로 1 sec (1000 millisecond) 기준당 0.2 sec 를 할당한다는 의미이다. (최대값은 1sec == 1000000 microsecond 이므로 1000000 임)
보통 cgroup의 디폴트 값은 cpu.cfs_quota=-1 이므로 위의 같은 경우는 20% 의 cpu를 할당하는 의미이다. 




저작자 표시 변경 금지
신고
Posted by OpenStack Korea 부대표 Seungkyu Ahn(seungkyua@gmail.com
###################################
## kube-dns (skydns) 설치, dashboard 설치
###################################
## 검색창에 [kubernetes] 을 넣고 검색을 하면 됨


$ cd ~/kube
$ export KUBE_ROOT=/home/ubuntu/go_workspace/src/k8s.io/kubernetes
$ export DNS_REPLICAS=1
$ export DNS_DOMAIN=cluster.local
$ export DNS_SERVER_IP=192.168.30.200

$ sed -e "s/\\\$DNS_REPLICAS/${DNS_REPLICAS}/g;\
s/\\\$DNS_DOMAIN/${DNS_DOMAIN}/g;" \
"${KUBE_ROOT}/cluster/addons/dns/skydns-rc.yaml.sed" > skydns-rc.yaml

## skydns-rc.yaml 에 kube-master-url 추가
$ vi skydns-rc.yaml
81         - --kube-master-url=http://192.168.30.13:8080


$ sed -e "s/\\\$DNS_SERVER_IP/${DNS_SERVER_IP}/g" \
"${KUBE_ROOT}/cluster/addons/dns/skydns-svc.yaml.sed" > skydns-svc.yaml

$ cat <<EOF >namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: kube-system
EOF


$ cp ~/go_workspace/src/k8s.io/kubernetes/cluster/addons/dashboard/dashboard-controller.yaml ~/kube/.
$ cp ~/go_workspace/src/k8s.io/kubernetes/cluster/addons/dashboard/dashboard-service.yaml ~/kube/.


## kube-master01 에 복사
$ ssh kube-master01 "mkdir -p kube"
$ scp ~/kube/skydns-rc.yaml kube-master01:~/kube/.
$ scp ~/kube/skydns-svc.yaml kube-master01:~/kube/.
$ scp ~/kube/namespace.yaml kube-master01:~/kube/.

$ scp ~/kube/dashboard-controller.yaml kube-master01:~/kube/.
$ scp ~/kube/dashboard-service.yaml kube-master01:~/kube/.

$ ssh kube-master01 "kubectl create -f ~/kube/namespace.yaml"
$ ssh kube-master01 "kubectl --namespace=kube-system create -f ~/kube/skydns-rc.yaml"
$ ssh kube-master01 "kubectl --namespace=kube-system create -f ~/kube/skydns-svc.yaml"



## dashboard 설치
$ cd ~/kube

## master api 에 접속할 수 있게 정보를 추가
$ vi kubernetes-dashboard.yaml
47         - --apiserver-host=http://192.168.30.13:8080

$ scp ~/kube/kubernetes-dashboard.yaml kube-master01:~/kube/.
$ ssh kube-master01 "kubectl create -f ~/kube/kubernetes-dashboard.yaml" 



## skydns 설치 확인
$ vi ~/kube/busybox.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: gcr.io/google_containers/busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always


$ scp ~/kube/busybox.yaml kube-master01:~/kube/.
$ ssh kube-master01 "kubectl create -f ~/kube/busybox.yaml"


## -s 옵션으로 api 서버 지정 가능
$ kubectl -s http://kube-master01:8080 get pods --all-namespaces -o wide
$ kubectl -s http://kube-master01:8080 describe pod kube-dns-v19-d1tse --namespace=kube-system

$ kubectl -s http://kube-master01:8080 get pods busybox -o wide
$ kubectl -s http://kube-master01:8080 exec busybox -- nslookup kubernetes.default




###################################
## kubectl 사용법
###################################

## nginx pod 생성  (replication controller 대신 replica set 이 생겼음)
$ kubectl -s http://kube-master01:8080 run nginx --image=nginx (--replicas=2) --port=80
$ kubectl -s http://kube-master01:8080 get pods
$ kubectl -s http://kube-master01:8080 get pods -o wide
$ kubectl -s http://kube-master01:8080 get pod -l run=nginx


## nginx scaling
$ kubectl -s http://kube-master01:8080 scale deployment/nginx --replicas=1

## nginx auto scaling
$ kubectl -s http://kube-master01:8080 autoscale deployment/nginx --min=1 --max=3


## nginx rc 조회
$ kubectl -s http://kube-master01:8080 get rs



## 서비스 멈춤없이 이미지 버전 올리기 (edit 로 파일 수정하면 됨)
$ kubectl -s http://kube-master01:8080 edit deployment/nginx


## nginx service 생성 (port : host에 노출되는 port,   target-port : docker 내부에서 뜨는 port)
$ kubectl -s http://kube-master01:8080 expose deployment nginx --port=8080 --target-port=80 (--type=LoadBalancer) --name=nginx
$ kubectl -s http://kube-master01:8080 get services


## nginx pod 삭제
$ kubectl -s http://kube-master01:8080 get deployment (nginx)
$ kubectl -s http://kube-master01:8080 delete deployment nginx

## nginx service 삭제
$ kubectl -s http://kube-master01:8080 delete service nginx

## nginx pod, service 동시 삭제
$ kubectl -s http://kube-master01:8080 delete deployment,service nginx
$ kubectl -s http://kube-master01:8080 delete deployments/nginx services/nginx

## nginx pod, service 동시 삭제 (label 활용 : -l or --selector)
$ kubectl -s http://kube-master01:8080 delete deployment,services -l app=nginx


## nginx replication controller 삭제 (디폴트는 pod 도 삭제됨, --cascade=false : rc 만 삭제) 
$ kubectl -s http://kube-master01:8080 delete rc nginx-rc
$ kubectl -s http://kube-master01:8080 delete rc nginx-rc --cascade=false


## nginx 안으로 들어가기
$ kubectl -s http://kube-master01:8080 exec -it nginx-3449338310-sl1ou -- /bin/bash

## pod 내의 컨테이너 로그 보기
$ kubectl -s http://kube-master01:8080 logs -f nginx-3449338310-sl1ou
$ kubectl -s http://kube-master01:8080 logs --tail=20 nginx-3449338310-sl1ou
$ kubectl -s http://kube-master01:8080 logs --since=1m nginx-3449338310-sl1ou




## Guestbook (redis-master, redis-slave, frontend) 샘플
$ ~/go_workspace/src/k8s.io/kubernetes
$ kubectl -s http://kube-master01:8080 create -f examples/guestbook/


## Service  frontend 타입을 ClusterIP 에서 NodePort 로 변경
$ kubectl -s http://kube-master01:8080 edit services/frontend
28   type: NodePort


## json format 으로 output 보기
$ kubectl -s http://kube-master01:8080 get svc frontend -o json
$ kubectl -s http://kube-master01:8080 get svc frontend -o "jsonpath={.spec.ports[0].nodePort}{"\n"}"


## Guestbook 삭제
$ kubectl -s http://kube-master01:8080 delete deployments,services -l "app in (redis, guestbook)"



## 명령어로 pod 생성하는 방법
$ kubectl -s http://kube-master01:8080 run frontend --image=gcr.io/google-samples/gb-frontend:v4 \
--env="GET_HOSTS_FROM=dns" --port=80 --replicas=3 \
--limits="cpu=100m,memory=100Mi" \
--labels="app=guestbook,tier=frontend"

## Service frontend 를 명령어로 NodePort 타입으로 생성
$ kubectl -s http://kube-master01:8080 expose deployment frontend \
--port=80 --target-port=80 --name=frontend --type=NodePort \
--labels=app=guestbook,tier=frontend --selector=app=guestbook,tier=frontend





###################################
## glusterFS 설치 및 Kubernetes 에서 활용
###################################
## glusterFS 설치

## gluster01 과 gluster02 모두 수행
# vi /etc/hosts
192.168.30.15   kube-node01 gluster01
192.168.30.16   kube-node02 gluster02

# mkfs.xfs -f /dev/sdb
# mkdir -p /data/gluster/brick1 && chmod -R 777 /data
# echo '/dev/sdb /data/gluster/brick1 xfs defaults 1 2' >> /etc/fstab
# mount -a && mount

# apt-get install -y glusterfs-server glusterfs-client
# service glusterfs-server start


## gluster01 에서
# gluster peer probe gluster02

## gluster02 에서
# gluster peer probe gluster01


## gluster01 과 gluster02 모두 수행
# mkdir -p /data/gluster/brick1/gv0 && chmod -R 777 /data
# mkdir -p /data/gluster/brick1/gv1 && chmod -R 777 /data/gluster/brick1/gv1


## gluster01 에서 수행 (gv1 은 pod 에서 glusterfs 연결할 때 사용할 디스크)
# gluster volume create gv0 replica 2 gluster01:/data/gluster/brick1/gv0 gluster02:/data/gluster/brick1/gv0
# gluster volume start gv0

# gluster volume create gv1 replica 2 gluster01:/data/gluster/brick1/gv1 gluster02:/data/gluster/brick1/gv1
# gluster volume start gv1


## gluster01 과 gluster02 모두 수행
# mkdir -p /ext && chmod 777 -R /ext
# mount -t glusterfs gluster01:/gv0 /ext



## kubernetes 와 glusterFS 테스트
$ cd ~/go_workspace/src/k8s.io/kubernetes
$ cp examples/volumes/glusterfs/*.json ~/kube && cd ~/kube

$ vi glusterfs-endpoints.json
11           "ip": "192.168.30.15"
23           "ip": "192.168.30.16"

$ vi glusterfs-pod.json
11                 "image": "nginx"
25                     "path": "gv1",
26                     "readOnly": false


$ ssh kube-master01 "mkdir -p kube"
$ scp ~/kube/glusterfs-endpoints.json kube-master01:~/kube/.
$ scp ~/kube/glusterfs-service.json kube-master01:~/kube/.
$ scp ~/kube/glusterfs-pod.json kube-master01:~/kube/.

$ ssh kube-master01 "kubectl create -f ~/kube/glusterfs-endpoints.json"
$ ssh kube-master01 "kubectl create -f ~/kube/glusterfs-service.json"
$ ssh kube-master01 "kubectl create -f ~/kube/glusterfs-pod.json"


$ kubectl -s http://kube-master01:8080 get pods glusterfs -o jsonpath='{.status.hostIP}{"\n"}'

$ ssh kube-node01 "mount | grep gv1"






저작자 표시 변경 금지
신고
Posted by OpenStack Korea 부대표 Seungkyu Ahn(seungkyua@gmail.com