일전 포스트에도 포스팅을 하였지만 Lightsail 을 저렴하게 사용하는 유저에게는 AWS 로드밸런서 + SSL 인증서 보다는 Let’s Encrypt 를 이용하는것이 더 좋습니다. 기본 3.5$ + 로드밸런서를 사용할경우 월18$ 의 사용요금이 발생 합니다.

작업순서는 route 53 dns 등록 -> lightsail 인스턴스 생성 -> 고정아이피 생성 + dns 생성 ->  로드밸런서 생성 -> route 53 설정 추가 -> ssl 인증서 인증 -> wp 설정 변경 순서로 진행이 됩니다.

AWS Lightsail 설정 https://lightsail.aws.amazon.com/ls/docs/ko_kr/articles/create-lightsail-load-balancer-and-attach-lightsail-instances
bitnami 설정 :https://docs.bitnami.com/aws/apps/wordpress/administration/
WP SSL 설정 :https://www.wpbeginner.com/wp-tutorials/how-to-fix-common-ssl-issues-in-wordpress-beginners-guide/

 

  • Lightsail 에서 인스턴스를 생성 합니다.

  • 기본으로 선택되어 있는 상품으로 진행 합니다.

 

  • 프리티어 사용과 별도로 사용요금이 3.5달러 지불됩니다.

 

  • 인스턴스 이름을 변경후 생성을 클릭 합니다.

 

 

  • 네트워킹을 클릭합니다.

 

  • 고정 IP 생성을 클릭합니다.
  • DNS 도메인 과 맵핑 하기 위해서는 반드시 고정 IP를 사용해야 합니다.

 

  • 고정 IP 위치를 확인후 인스턴스에 연결 에서 인스턴스를 지정합니다.

 

  • 고정 IP 확인란 에서  생성을 클릭합니다.

 

 

  • 고정IP 생성이 완료되었습니다.

 

 

  • Lightsail  에서 사용할 dns 영역을 생성 합니다.
  • DNS 영역 생성을 클릭합니다.

  • 도메인 이름을 입력합니다.

 

  • DNS 영역 생성을 클릭합니다.

  • 도메인 등록기관 에서 name server 를 지정합니다.
  • 보통은 도메인을 구입한 곳에서 name server 를 변경할수 있습니다.
  • ex) 가비아 , cafe24등

 

  • name server 를 변경합니다.

  • route 53 설정
  • DNS 관리를 클릭합니다.

 

 

  • 호스트 영역생성을 클릭합니다.

 

  • 호스팅 영역생성을 클릭합니다.

 

  • 도메인 입력후 생성을 클릭합니다.

 

  • 생성후 화면

 

  • Lightsail 에서 네트워킹 -> DNS 영역에서 관리를 클릭합니다.

 

  • 레코드 추가를 클릭합니다.

 

  • @ 도메인에 를 추가후 ip 부분에서는 고정아이피를 추가 합니다.
  • 마우스 클릭으로 고정아이피를 지정 할수 있습니다.

 

  • www 레코드를 추가 합니다.

 

  • 네트워킹 -> 로드 밸런서 생성을 클릭합니다.

 

 

  • 리전의 경우 인스턴스가 서울리전 사용시 해당 리전으로 지정합니다.
  • https 사용시 인증서를 생성 해야 하며 로드 밸런서 생성후 인증서를 생성 합니다.

 

  • 로드밸런서 이름을 지정하고 로드 밸런서 생성을 클릭합니다.
  • 로드밸런서 비용이 한달에 18$ 입니다.

 

 

  • 로드밸런서 사용할 인스턴스를 지정합니다.

 

  • 로드 밸런서 -> 인바운드 트래픽 에서 인증서 생성을 클릭합니다.

 

  • domain 및 2차 domain 을 지정 한후 생성을 클릭합니다.

 

  • 인증서 생성후 domain 인증 txt code 가 나옵니다. 메모장에 드래그 하여 메모장에 붙여 넣기 합니다.
  • 또한 인바운드 트래픽에 최상단에 있는 로드밸런서 부분도 드래그하여 메모장에 붙여 넣기 합니다.

 

  • Lightsail 에서 도메인 설정 및 route 53 에서 도메인설정을 해야 합니다.
  • Lightsail 네트워크 -> DNS 영역 에서 관리를 클릭합니다.

 

  • 기존 DNS A 레코드를 고정 IP 에서 로드밸런서로 지정 합니다.
  • CNAME 레코드를 추가 합니다.

 

  • 레코드 추가를 클릭하여 CNAME 레코드를 추가 합니다.
  • 메모장에 붙여넣기 했던 항목중 이름 부분은 하위도메인에 값 부분은 맵핑부분에 붙여 넣기 합니다.
  • _8c9b8fde94178cd4ea044d3e1dab3ee0.www.example.com. 라고 하면 www 까지 즉,
  • _8c9b8fde94178cd4ea044d3e1dab3ee0.www 까지만 붙여넣기 합니다.

 

  • Route 53 설정
  • Lightsail 로드밸런서를 Route 53 에 등록 합니다.
  • Lightsail 로드밸런서의 경우 이름을 www / 유형 A – IPv4 주소 / 별칭 예 를 선택후 별칭대상에 붙여 넣기 합니다.
  • 로드밸런서는 도메인 ex) example.com / 2차도메인 www.example.com 으로 등록 합니다.

 

  • ssl 인증서를 사용하기위하여 메모장에 복사한 내용을 CNAME 로 추가 합니다.

 

 

 

  • Route 53 domain 작업완료 예

 

  • Lightsail -> 로드 밸런서 -> 인바운드 트래픽으로 이동 합니다.
  • 별도로 잘못 설정 하지 않았다면 인증서 상태가 유효로 변경될 것입니다.
  • 생성된 인증서를 선택 합니다.

 

 

  • site 접속 테스트
  • http / https 로 접속을 해봅니다.

 

  • https 접속 테스트
  • https 의 경우 정상적으로 접속이 되지 않습니다.
  • 별도의 WP 플러그인을 사용 해야 합니다.

 

 

  • ssh 로 Lightsail 로 접속 합니다.
$ ssh -i LightsailDefaultKey-ap-northeast-2.pem bitnami@192.168.0.22
The authenticity of host '192.168.0.22 (192.168.0.22)' can't be established.
ECDSA key fingerprint is SHA256:AHwlOFx9ql8AZjjqz6Sfb8PYsQJ/FgRakbaUQVfQ69Y.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '15.164.65.11' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-1081-aws x86_64)
*** System restart required ***
       ___ _ _                   _
      | _ |_) |_ _ _  __ _ _ __ (_)
      | _ \ |  _| ' \/ _` | '  \| |
      |___/_|\__|_|_|\__,_|_|_|_|_|

  *** Welcome to the Bitnami WordPress 5.1.1-2 ***
  *** Documentation:  https://docs.bitnami.com/aws/apps/wordpress/ ***
  ***                 https://docs.bitnami.com/aws/ ***
  *** Bitnami Forums: https://community.bitnami.com/ ***
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.


bitnami@ip-172-26-9-64:~$ sudo vi /opt/bitnami/apps/wordpress/htdocs/wp-config.php
define( 'DB_COLLATE', '' );

// 여기부터 추가 합니다.
define('FORCE_SSL_ADMIN', true);
// in some setups HTTP_X_FORWARDED_PROTO might contain
// a comma-separated list e.g. http,https
// so check for https existence
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';


설정 완료후 서비스 재시작
bitnami@ip-172-26-9-64:~$ sudo /opt/bitnami/ctlscript.sh restart

 

  • https 접속 확인

  • simple ssl WP plugin 설치합니다.

 

  • 에서 운영한 데이터 이관후 wp 작업을 하였다면 simple ssl WP plugin 설치후 wp-config.php 에 아래와 같이 추가합니다.
// 최하단에 추가
$server_opts = array("HTTP_CLOUDFRONT_FORWARDED_PROTO" => "https", "HTTP_CF_VISITOR"=>"https", "HTTP_X_FORWARDED_PROTO"=>"https", "HTTP_X_FORWARDED_SSL"=>"on", "HTTP_X_PROTO"=>"SSL", "HTTP_X_FORWARDED_SSL"=>"1");
foreach( $server_opts as $option => $value ) {
 if ((isset($_ENV["HTTPS"]) && ( "on" == $_ENV["HTTPS"] )) || (isset( $_SERVER[ $option ] ) && ( strpos( $_SERVER[ $option ], $value ) !== false )) ) {
  $_SERVER[ "HTTPS" ] = "on";
  break;
 }
}
//END Really Simple SSL

// wp-config.php  권한을 640 에서 666 으로 변경 합니다.
bitnami@ip-172-26-9-64:~$ cd /opt/bitnami/apps/wordpress/htdocs/
bitnami@ip-172-26-9-64:/opt/bitnami/apps/wordpress/htdocs$ ll
total 216
drwxrwxr-x  5 bitnami daemon  4096 Jun 25 08:04 ./
drwxr-xr-x  7 root    root    4096 Apr 30 10:50 ../
-rw-rw-r--  1 bitnami daemon   420 Nov 30  2017 index.php
-rw-rw-r--  1 bitnami daemon 19935 Jun 25 07:51 license.txt
-rw-rw-r--  1 bitnami daemon  7447 Jun 25 07:51 readme.html
-rw-rw-r--  1 bitnami daemon  6919 Jan 12 06:41 wp-activate.php
drwxrwxr-x  9 bitnami daemon  4096 Jun 25 07:51 wp-admin/
-rw-rw-r--  1 bitnami daemon   369 Nov 30  2017 wp-blog-header.php
-rw-rw-r--  1 bitnami daemon  2283 Jan 21 01:34 wp-comments-post.php
-rw-r-----  1 bitnami daemon  4997 Jun 25 08:04 wp-config.php
-rw-rw-r--  1 daemon  daemon  2898 Jun 25 07:51 wp-config-sample.php
drwxrwxr-x  7 bitnami daemon  4096 Jun 25 07:49 wp-content/
-rw-rw-r--  1 bitnami daemon  3847 Jan  9 08:37 wp-cron.php
drwxrwxr-x 20 bitnami daemon 12288 Jun 25 07:51 wp-includes/
-rw-rw-r--  1 bitnami daemon  2502 Jan 16 05:29 wp-links-opml.php
-rw-rw-r--  1 bitnami daemon  3306 Nov 30  2017 wp-load.php
-rw-rw-r--  1 bitnami daemon 39551 Jun 25 07:51 wp-login.php
-rw-rw-r--  1 bitnami daemon  8403 Nov 30  2017 wp-mail.php
-rw-rw-r--  1 bitnami daemon 18962 Jun 25 07:51 wp-settings.php
-rw-rw-r--  1 bitnami daemon 31085 Jan 16 16:51 wp-signup.php
-rw-rw-r--  1 bitnami daemon  4764 Nov 30  2017 wp-trackback.php
-rw-rw-r--  1 bitnami daemon  3068 Aug 17  2018 xmlrpc.php
bitnami@ip-172-26-9-64:/opt/bitnami/apps/wordpress/htdocs$ chmod 666 wp-config.php

 

 

  • simple ssl 플러그인을 실행 합니다.

 

  • http -> https 리다이렉트는 별도로 설정해줄 필요가 없습니다.

 

최근 들어 Lightsail 관련 작업을 종종하고 있습니다.

AWS 접속시 가장 편하게 접속 하는 방법을 소개 합니다.

Linux 사용시는 터미널에서 하시면 되며 Windows 사용시에는 Git-Bash 로 이용하여 접속 합니다.

git bash 는 다음 링크에서 다운받으실수 있습니다.

https://git-scm.com/download/win

 

  • ssh 키파을 다운 합니다.
  • 상단에 계정을 클릭 합니다.

 

  • Lightsail ssh key 파일을 다운합니다.
  • 인스턴스가 있는 리전의 key파일을 다운 받습니다.

 

  • Git-Bash 를 실행 합니다.
  • ssh -i 옵션으로 다룬로드 받은 키파일의 위치를 지정 합니다. bitnami 이용시 bitnami 유저로 로그인을합니다.

  • 로드밸런서 이용시 ip 로 접속해야 합니다.

Lightsail 을 사용 하여 WordPress 를 운영할 경우 Let’s encrypt 인증서를 간편하게 사용 할수 있습니다.

정석적인 방벙으로는 Lightsail 로드밸런서를 붙여도 되지만 가격이 많이 나가기 때문에 추천 하지 않습니다.

 

  • 명령어 형식은 다음과 같습니다. 
  • example.com 에 도메인 넣어 주고 2차 도메인은 -d 옵션을 사용하여 아래와 같이 넣어 줍니다. 
  • /opt/bitnami/letsencrypt/scripts/generate-certificate.sh -m test-user@gmail.com -d example.com -d www.example.com
  • bitnami apache 서비스가 재기동 되기 때문에 별도로 작업을 해줄 필요는 없습니다. 
  • 기본설치된 스크립트
root@ip-172-26-14-40:~# /opt/bitnami/letsencrypt/scripts/generate-certificate.sh -m test-user@gmail.com -d example.com -d www.example.com

This tool will now stop the web server and configure the required SSL certificate. It will also start it again once finished.

When supplying multiple domains, Lego creates a SAN (Subject Alternate Names) certificate which results in only one certificate
under the email "test-user@gmail.com" valid for all domains you entered ("example.com www.example.com").

The first domain in your list ("example.com") will be added as the "CommonName" of the certificate and the rest will be added
as "DNSNames" to the SAN extension  within the certificate

Do you want to continue? [y/n]: y
Unmonitored apache
Syntax OK
/opt/bitnami/apache2/scripts/ctl.sh : httpd stopped
2019/06/24 07:36:11 No key found for account test-user@gmail.com. Generating a P384 key.
2019/06/24 07:36:11 Saved key to /opt/bitnami/letsencrypt/accounts/acme-v02.api.letsencrypt.org/test-user@gmail.com/keys/test-user@gmail.com.key
2019/06/24 07:36:12 Please review the TOS at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
Do you accept the TOS? Y/n
y
2019/06/24 07:36:21 [INFO] acme: Registering account for test-user@gmail.com
!!!! HEADS UP !!!!

                Your account credentials have been saved in your Let's Encrypt
                configuration directory at "/opt/bitnami/letsencrypt/accounts".
                You should make a secure backup of this folder now. This
                configuration directory will also contain certificates and
                private keys obtained from Let's Encrypt so making regular
                backups of this folder is ideal.2019/06/24 07:36:21 [INFO] [example.com, www.example.com] acme: Obtaining bundled SAN certificate
2019/06/24 07:36:22 [INFO] [example.com] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz/iDs2het-u8P9UW7tnlyReFHM8VmVhx5NNy0zqBCW5cQ
2019/06/24 07:36:22 [INFO] [www.example.com] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz/E_aGWBPUekKDlXKKhZr7fZCWcv5M9938J35vgsdKXRE
2019/06/24 07:36:22 [INFO] [example.com] acme: use tls-alpn-01 solver
2019/06/24 07:36:22 [INFO] [www.example.com] acme: use tls-alpn-01 solver
2019/06/24 07:36:22 [INFO] [example.com] acme: Trying to solve TLS-ALPN-01
2019/06/24 07:36:28 [INFO] [example.com] The server validated our request
2019/06/24 07:36:28 [INFO] [www.example.com] acme: Trying to solve TLS-ALPN-01
2019/06/24 07:36:35 [INFO] [www.example.com] The server validated our request
2019/06/24 07:36:35 [INFO] [example.com, www.example.com] acme: Validations succeeded; requesting certificates
2019/06/24 07:36:36 [INFO] [example.com] Server responded with a certificate.
Syntax OK
/opt/bitnami/apache2/scripts/ctl.sh : httpd started at port 80
Monitored apache

Congratulations, the generation and configuration of your SSL certificate finished properly.

You can now configure a cronjob to renew it every month.

Do you want to proceed? [y/n]: y
root@ip-172-26-14-40:~#

root@ip-172-26-14-40:~$ crontab -l
0 0 1 * * sudo /opt/bitnami/letsencrypt/lego --path="/opt/bitnami/letsencrypt" --tls --email="test-user@gmail.com"  --domains=example.com --domains=www.example.com renew && sudo /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf -k graceful
root@ip-172-26-14-40:~$

 

  • web site 확인

Kimchi is an HTML5 based management tool for KVM. It is designed to make it as easy as possible to get started with KVM and create your first guest.

kimchi-project site: https://github.com/kimchi-project

kvm 설치 : http://dev.crois.net/2017/11/26/system-centos7-kvm-install/

kvm bridge: http://dev.crois.net/2019/05/30/centos-bridge-%EC%84%A4%EC%A0%95/

  • 패키지 설치 및 daemon start
[root@kvm-server01 ~]# wget https://github.com/kimchi-project/kimchi/releases/download/2.5.0/wok-2.5.0-0.el7.centos.noarch.rpm
[root@kvm-server01 ~]# wget https://github.com/kimchi-project/kimchi/releases/download/2.5.0/kimchi-2.5.0-0.el7.centos.noarch.rpm
[root@kvm-server01 ~]# yum install wok-2.5.0-0.el7.centos.noarch.rpm
[root@kvm-server01 ~]# yum install -y kimchi-2.5.0-0.el7.centos.noarch.rpm
[root@kvm-server01 ~]# sed -i 's/^#session_timeout = .*/session_timeout = 1440/g' /etc/wok/wok.conf
[root@kvm-server01 ~]# systemctl enable wokd
[root@kvm-server01 ~]# systemctl start wokd

 

  • 8001 port 오픈 확인
[root@kvm-server01 ~]# netstat -antp |grep 8001
tcp        0      0 0.0.0.0:8001            0.0.0.0:*               LISTEN      28498/nginx: master
[root@kvm-server01 ~]#

 

  • web연결 (https://kvm-service01:8001)
  • root 유저로 로그인 합니다.

 

  • KVM 관리
  • Virtuallization 으로 이동 합니다.

 

kubernetes install

주의!!! 본 문서는 작성중인 문서 이며, 내용이 완벽하게 정리 되지 않았습니다.

단순참고 부탁 드립니다.

참고 사이트 :

https://www.howtoforge.com/tutorial/centos-kubernetes-docker-cluster/

https://kubernetes.io/docs/setup/cri/

https://juejin.im/post/5caea3ffe51d456e79545c32

https://cloud.tencent.com/developer/article/1409419

https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/

 

 

  • 모든 node 에서 작업
  • hosts파일 설정
[root@k8s-all-node ~]# vi /etc/hosts
10.10.10.27     k8s-master
10.10.10.28     k8s-node01
10.10.10.29     k8s-node02

 

  • SELINUX Disable
[root@k8s-all-node ~]# vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled

 

  • firewalld disable
[root@k8s-all-node ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@k8s-all-node ~]#

 

  • sysctl.conf 설정
[root@k8s-all-node ~]# cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF


[root@k8s-all-node ~]# sysctl --system
* Applying /usr/lib/sysctl.d/00-system.conf ...
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/k8s.conf ...
* Applying /etc/sysctl.conf ...
[root@k8s-all-node ~]#

 

  • swap off
[root@k8s-all-node ~]# swapoff -a

[root@k8s-all-node ~]# vi /etc/fstab
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=d7bb5d3b-5b37-47e0-8c26-fe40f7311597 /                       xfs     defaults        0 0
UUID=43ec35ea-2e35-46f1-864c-b13603a8acac /boot                   xfs     defaults        0 0
#UUID=2de336ec-4a33-36r1-8w2s-asdf2342ccgg swap                   swap     defaults        0 0

 

[root@k8s-all-node ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@k8s-all-node ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@k8s-all-node ~]# yum list docker-ce --showduplicates | sort -r
[root@k8s-all-node ~]# yum install -y docker-ce-18.06.3.ce

[root@k8s-all-node ~]# mkdir /etc/docker

# cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF


[root@k8s-all-node ~]# mkdir -p /etc/systemd/system/docker.service.d
[root@k8s-all-node ~]# systemctl daemon-reload
[root@k8s-all-node ~]# systemctl restart docker

 

  • kubernetes install & system rebooting
[root@k8s-all-node ~]# vi /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

[root@k8s-all-node ~]# yum install -y kubelet kubeadm kubectl
[root@k8s-all-node ~]# init 6

[root@k8s-all-node ~]# systemctl start docker ; systemctl enable docker
[root@k8s-all-node ~]# systemctl start kubelet ; systemctl enable kubelet

 

  • k8s-master only
  • coredns 의 경우 network add-on 설치후 Running 으로 상태가 바뀝니다.
[root@k8s-master ~]# kubeadm init --apiserver-advertise-address=10.10.10.27 --pod-network-cidr=20.20.0.0/16
~중략

[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

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

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.10.10.27:6443 --token syojz8.svxybs8x0f3iy28a \
    --discovery-token-ca-cert-hash sha256:b28c6474e92e2bc87e8f7b470119e506df36ae6ae08a8f50dd070f5d714a28e1
[root@k8s-master ~]#

[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES    AGE     VERSION
k8s-master   Ready    master   2m22s   v1.14.1
[root@k8s-master ~]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-fb8b8dccf-c9hvh              0/1     Pending   0          78s
kube-system   coredns-fb8b8dccf-hmt6w              0/1     Pending   0          78s
kube-system   etcd-k8s-master                      1/1     Running   0          41s
kube-system   kube-apiserver-k8s-master            1/1     Running   0          42s
kube-system   kube-controller-manager-k8s-master   1/1     Running   0          31s
kube-system   kube-proxy-92c9h                     1/1     Running   0          78s
kube-system   kube-scheduler-k8s-master            1/1     Running   0          16s
[root@k8s-master ~]#

 

[root@k8s-master ~]# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
[root@k8s-master ~]# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

[root@k8s-master ~]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   calico-node-r72sb                    2/2     Running   0          38s
kube-system   coredns-fb8b8dccf-c9hvh              0/1     Running   0          4m15s
kube-system   coredns-fb8b8dccf-hmt6w              0/1     Running   0          4m15s
kube-system   etcd-k8s-master                      1/1     Running   0          3m38s
kube-system   kube-apiserver-k8s-master            1/1     Running   0          3m39s
kube-system   kube-controller-manager-k8s-master   1/1     Running   0          3m28s
kube-system   kube-proxy-92c9h                     1/1     Running   0          4m15s
kube-system   kube-scheduler-k8s-master            1/1     Running   0          3m13s
[root@k8s-master ~]#

 

  • k8s-master 에서 확인
[root@k8s-master ~]# kubeadm token create --print-join-command
kubeadm join 10.10.10.27:6443 --token eq8odd.rxcfznxvepos1pg8     --discovery-token-ca-cert-hash sha256:aa3949ebeec315e5d303a18fc049c33a89a9110d8bdec0a93f3c065dcb78c689 
[root@k8s-master ~]#

 

  • k8s-node01 / k8s-node02 에서 작업
[root@k8s-node01 ~]# kubeadm join 10.10.10.27:6443 --token \
 eq8odd.rxcfznxvepos1pg8     --discovery-token-ca-cert-hash sha256:aa3949ebeec315e5d303a18fc049c33a89a9110d8bdec0a93f3c065dcb78c689

[root@k8s-node02 ~]# kubeadm join 10.10.10.27:6443 --token \
eq8odd.rxcfznxvepos1pg8     --discovery-token-ca-cert-hash sha256:aa3949ebeec315e5d303a18fc049c33a89a9110d8bdec0a93f3c065dcb78c689

 

  • k8s-master 에서 확인
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES    AGE     VERSION
k8s-master   Ready    master   8m43s   v1.14.3
k8s-node01   Ready    <none>   73s     v1.14.3
k8s-node02   Ready    <none>   62s     v1.14.3
[root@k8s-master ~]#

 

  • dash-board 설치 를 위하여 인증서를 생성 합니다.
[root@k8s-master ~]# mkdir /root/certs
[root@k8s-master ~]# cd /root/certs
[root@k8s-master certs]# openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048
[root@k8s-master certs]# openssl rsa -passin pass:x -in dashboard.pass.key -out dashboard.key
[root@k8s-master certs]# openssl req -new -key dashboard.key -out dashboard.csr
[root@k8s-master certs]# openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt

 

  • dash-board 를 설치 합니다.
[root@k8s-master ~]# kubectl create secret generic kubernetes-dashboard-certs --from-file=/root/certs -n kube-system
[root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

 

  • dash-borad 설정을 변경합니다.
[root@k8s-master ~]# kubectl edit service kubernetes-dashboard -n kube-system
#   type: ClusterIP    <--  부분을 NodePort 으로 변경

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kube-system"},"spec":{"ports":[{"port":443,"targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"}}}
  creationTimestamp: "2019-06-12T07:41:01Z"
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
  resourceVersion: "2224"
  selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
  uid: 6cb7d772-8ce5-11e9-ad2b-525400fce674
spec:
  clusterIP: 10.108.72.190
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
#  type: ClusterIP    <--  변경전
  type: NodePort      <--  변경후 
status:
  loadBalancer: {}

 

  • dashboard 상태 확인 및 접속 정보 확인
  • 443:30906/TCP  로 맵핑되어 있습니다.
[root@k8s-master ~]#  kubectl get pods -n kube-system
NAME                                    READY   STATUS    RESTARTS   AGE
calico-node-8mvl8                       2/2     Running   0          15m
calico-node-br9sw                       2/2     Running   0          15m
calico-node-r72sb                       2/2     Running   0          18m
coredns-fb8b8dccf-c9hvh                 1/1     Running   0          22m
coredns-fb8b8dccf-hmt6w                 1/1     Running   0          22m
etcd-k8s-master                         1/1     Running   0          21m
kube-apiserver-k8s-master               1/1     Running   0          21m
kube-controller-manager-k8s-master      1/1     Running   0          21m
kube-proxy-6t9vw                        1/1     Running   0          15m
kube-proxy-8vw5v                        1/1     Running   0          15m
kube-proxy-92c9h                        1/1     Running   0          22m
kube-scheduler-k8s-master               1/1     Running   0          21m
kubernetes-dashboard-5f7b999d65-t88x2   1/1     Running   0          3m56s
[root@k8s-master ~]# 

[root@k8s-master ~]# kubectl get service -n kube-system
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
calico-typha           ClusterIP   10.101.41.222   <none>        5473/TCP                 20m
kube-dns               ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   23m
kubernetes-dashboard   NodePort    10.108.72.190   <none>        443:30906/TCP            5m5s
[root@k8s-master ~]#

 

  • dash-borad 계정생성
[root@k8s-master ~]# kubectl create serviceaccount cluster-admin-dashboard-sa
[root@k8s-master ~]# kubectl create clusterrolebinding cluster-admin-dashboard-sa --clusterrole=cluster-admin --serviceaccount=default:cluster-admin-dashboard-sa

 

  • dash-borad 토큰값 생성
[root@k8s-master ~]# kubectl get secret $(kubectl get serviceaccount cluster-admin-dashboard-sa -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImNsdXN0ZXItYWRtaW4tZGFzaGJvYXJkLXNhLXRva2VuLWNzZ3A4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImNsdXN0ZXItYWRtaW4tZGFzaGJvYXJkLXNhIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNGFkYjU3Y2QtOGNlNi0xMWU5LWFkMmItNTI1NDAwZmNlNjc0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6Y2x1c3Rlci1hZG1pbi1kYXNoYm9hcmQtc2EifQ.E_T09ftzrV_68Ie0nuthJ1yjFeNByeok87x3F653dB9Pt0a7n6hWGOZsiCUaU0mevm56kl2QUgzV5J-waNvr5Fv4IZ5NMmId_XfIGWlsul2P6y4wag96DuG65K1T2DwoGix4GO8a1p7HISOQ0knxr0OVMOjXRLcOXUov3h3Mv87T-O1gjVIUHAMvB70aZK1ScBaULegqzQbHwjpRc7FFOKUQB4HANJ6gw1asMF4yw0M_dF3GK16GaCxxKEW6rQWGrdN_TNB2nIXKgKqfqHS_35o02yYd2_cU3TDZ14xGl7F2zSVJxzB99ftyC6pwquPF3y3qhXeUFNU0tyCyxKUrWQ
[root@k8s-master ~]#

 

  • dash-borad 접속 ( https://10.10.10.27:30906/#!/login )
  • 안전하지 않음(으)로 이동을 클릭 합니다.

 

  • 토큰정보를 입력 합니다.

 

  • dash-board 화면

 

  • k8s Testing — 작성중
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx
[root@k8s-master ~]# kubectl describe deployment nginx
Name:                   nginx
Namespace:              default
CreationTimestamp:      Fri, 03 May 2019 00:28:11 +0900
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               1 desired | 1 updated | 1 total | 0 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      False   MinimumReplicasUnavailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  <none>
NewReplicaSet:   nginx-65f88748fd (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  18s   deployment-controller  Scaled up replica set nginx-65f88748fd to 1
[root@k8s-master ~]#


[root@k8s-master ~]# kubectl create service nodeport nginx --tcp=80:80


[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        6m33s
nginx        NodePort    10.102.109.228   <none>        80:30187/TCP   21s
[root@k8s-master ~]#

 

  • nginx 확인
[root@k8s-master ~]#  curl k8s-node01:30187
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@k8s-master ~]#

 

  • pods scale
최초 생성시 1개의 pods 입니다. 

[root@k8s-master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-65f88748fd-8lqrb   1/1     Running   0          5m12s
[root@k8s-master ~]#

pods 을 5개로 늘립니다. 
[root@k8s-master ~]# kubectl scale --replicas=5 deployment/nginx
deployment.extensions/nginx scaled


[root@k8s-master ~]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
nginx-65f88748fd-6v7n5   1/1     Running             0          13s
nginx-65f88748fd-86svl   0/1     ContainerCreating   0          13s
nginx-65f88748fd-8lqrb   1/1     Running             0          12m
nginx-65f88748fd-pq8p8   0/1     ContainerCreating   0          13s
nginx-65f88748fd-w4tq8   0/1     ContainerCreating   0          13s
[root@k8s-master ~]#

 

  • pod 삭제
[root@k8s-master ~]# kubectl delete deployment/nginx

삭제 확인 
[root@k8s-master ~]# kubectl get pods -o wide
No resources found.