토큰이 만료되었을 경우 노드를 생성하기 위해 마스터 서버에서 아래의 명령으로 토큰을 확인해줍니다.
kubeadm token create: 토큰 생성
다음엔 인증서도 생성해서 확인 후, 새롭게 노드로 생성할 서버에서 명령어를 입력합니다.
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //': 인증서 생성
노드로 만드려는 서버에서 아래의 명령어를 입력하면 노드가 추가 됩니다.
kubeadm join 10.0.0.1:6443 --token c6bgie.t3rh7btbturegnlw --discovery-token-ca-cert-hash sha256:ffc454396247912f69ebca122451d34742d6ede07ba203253aca6fba12ea9e8b
저번 시간에 yaml 파일을 사용하여 pod를 생성했었는데, pod 생성 시 랜덤으로 node에 들어갔었습니다.
그래서 이번에는 node를 지정해서 넣을 수 있는 명령어를 알아보겠습니다.
---
apiVersion: v1
kind: Pod
metadata:
name: apache
labels:
app: web1
spec:
nodeName: node2 => nodename을 지정해주면 원하는 노드에서 pod가 만들어진다.
containers:
- name: apache
image: httpd
ports:
- containerPort: 80
pod를 생성하던 도중 이미지 pull 제한 문제가 생겨, secret을 생성하고 진행하려 해도 해결이 되지 않아서
docker에서 다운 받은 이미지를 묶어서 이미지를 사용하려는 서버에 아래와 같이 명령어를 입력했습니다.
docker save -o [example.tar] [tar로 묶을 이미지명]: 이미지를 tar파일로 묶어 준다.
ex) docker save -o word.tar wordpress:5.6 httpd:latest alpine:latest nginx:latest nginx:1.23 nginx:1.14 centos:7 mysql:5.7
scp [파일명] [보낼 서버의 계정]@[보낼 서버의 IP]:[경로]
ex)scp word.tar root@10.0.0.1:/root
- image를 받은서버
ctr [global options] command [command options]
ex) ctr --namespace k8s.io image import word.tar: k8s.io 네임스페이스에 word.tar로 묶인 이미지들을 적용한다.
crictl [global options] comman [command options]
ex) crictl -r unix:///run/containerd/containerd.sock image ls: 받은 이미지 확인
이 과정을 다 한 후에, docker hub에서 이미지를 받지 않도록 yaml 파일에 옵션을 하나 추가해주었습니다.
imagePullPolicy: Never
ex)
---
apiVersion: v1
kind: Pod
metadata:
name: wp
labels:
run: myword
spec:
containers:
- name: wp
image: wordpress:5.6
imagePullPolicy: Never
env:
- name: WORDPRESS_DB_HOST
value: 10.42.0.2
- name: WORDPRESS_DB_NAME
value: wordpress
- name: WORDPRESS_DB_USER
value: root
- name: WORDPRESS_DB_PASSWORD
value: It12345!
ports:
- containerPort: 80
alpine, centos와 같은 이미지로 컨테이너를 생성할 때는 꼭 컨테이너가 계속 실행되도록 명령어를 넣어주어야 한다.
명령어로 alpine, centos와 같은 이미지로 파드를 실행 할 때는,
kubectl run c7 --image centos:7 -it --bash
yml 파일로 alpine, centos 이미지로 파드를 만들어서 실행 할 때는, command를 넣어준다.
--- apiVersion: v1 kind: Pod metadata: name: apache labels: app: web1 spec: nodeName: node2 containers: - name: apache image: httpd ports: - containerPort: 80 imagePullPolicy: IfNotPresent - name: alpine name: apache labels: app: web1 spec: nodeName: node2 containers: - name: apache image: httpd ports: - containerPort: 80 imagePullPolicy: IfNotPresent - name: alpine image: alpine * command: [ "/bin/sh", "-c", "while true; do sleep 1000; done" ] * imagePullPolicy: IfNotPresent
arg가 cmd보다 우선시 된다.
1. 연습문제
- wordpress pod, mysql pod를 각 각 생성하고 서로 연결을 하기
- 우선 mysql 파드를 먼저 생성하여 IP를 확인한다.
vi ms.yml --- apiVersion: v1 kind: Pod metadata: name: ms labels: db: sql spec: containers: - name: mysql image: mysql:5.7 imagePullPolicy: Never env: - name: MYSQL_ROOT_PASSWORD value: It12345! - name: MYSQL_DATABASE value: wordpress - name: MYSQL_ROOT_HOST value: '%' ports: - containerPort: 3306
2. mysql pod의 ip 확인kubectl get po -o wide
3. wordpress 파드 생성 시, DB_HOST에 mysql 파드의 ip를 입력한다.vi wp.yml --- apiVersion: v1 kind: Pod metadata: name: wp labels: run: myword spec: containers: - name: wp image: wordpress:5.6 imagePullPolicy: Never env: - name: WORDPRESS_DB_HOST value: 10.42.0.2 <= 여기에 mysql pod의 IP 입력 - name: WORDPRESS_DB_NAME value: wordpress - name: WORDPRESS_DB_USER value: root - name: WORDPRESS_DB_PASSWORD value: It12345! ports: - containerPort: 80
4. wordpress를 포트포워딩 해준다.kubectl expose po wp --type=NodePort
5. 포트포워딩 해준 포트 확인kubectl get services
- 확인