복습
Ingress
git clone https://github.com/hali-linux/_Book_k8sInfra.git
- ingress기능을 테스트하기위해 강사님자료를 git으로 다운받는다.
kubectl apply -f /root/_Book_k8sInfra/ch3/3.3.2/ingress-nginx.yaml
- kubectl get pods -n ingress-nginx
- mkdir ingress && cd $_
vi ingress-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: foods-deploy
spec:
replicas: 1
selector:
matchLabels:
app: foods-deploy
template:
metadata:
labels:
app: foods-deploy
spec:
containers:
- name: foods-deploy
image: 192.168.1.189:5000/test_home:v1.0
---
apiVersion: v1
kind: Service
metadata:
name: foods-svc
spec:
type: ClusterIP
selector:
app: foods-deploy
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sales-deploy
spec:
replicas: 1
selector:
matchLabels:
app: sales-deploy
template:
metadata:
labels:
app: sales-deploy
spec:
containers:
- name: sales-deploy
image: 192.168.1.189:5000/test-home:v2.0
---
apiVersion: v1
kind: Service
metadata:
name: sales-svc
spec:
type: ClusterIP
selector:
app: sales-deploy
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: home-deploy
spec:
replicas: 1
selector:
matchLabels:
app: home-deploy
template:
metadata:
labels:
app: home-deploy
spec:
containers:
- name: home-deploy
image: 192.168.1.189:5000/test-home:v0.0
---
apiVersion: v1
kind: Service
metadata:
name: home-svc
spec:
type: ClusterIP
selector:
app: home-deploy
ports:
- protocol: TCP
port: 80
targetPort: 80
- kubectl apply -f ingress-deploy.yaml
- kubectl get all
ingress-config
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /foods
backend:
serviceName: foods-svc
servicePort: 80
- path: /sales
backend:
serviceName: sales-svc
servicePort: 80
- path:
backend:
serviceName: home-svc
servicePort: 80
kubectl apply -f ingress-config.yaml
vi ingress-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
selector:
app.kubernetes.io/name: ingress-nginx
type: LoadBalancer
externalIPs:
- 192.168.2.0
Volume
pv/pvc
pv-pvc-poc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Mi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
selector:
matchLabels:
type: local
---
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
labels:
app: task-pv-pod
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: task-pv-claim
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
NFS
yum install -y nfs-utils.x86_64
- 현재 Centos7는 구형 버전이라 NFS를 모른다. 그래서 설치를 진행해줘야한다.
mkdir /nfs_shared
chmod 777 /nfs_shared
echo '/nfs_shared 192.168.0.0/20(rw,sync,no_root_squash)' >> /etc/exports
systemctl enable --now nfs
Worker에서 마운트 테스트해보기
mount -t nfs MasterIP:/nfs_shared /mnt
- 마스터노드의 IP의 /nfs_shared 디렉토리를 Worker의 /mnt에 마운트한다.
umount /mnt
에서 언마운트 할 수 있다.
vi nfs-pv.yaml (PV 작성)
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 192.168.1.189
path: /nfs_shared
kubectl apply -f nfs-pv.yaml
kubectl get pv
vi nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Mi
- 라벨이 없다.
- 만약 라벨이 없어 연결할 태그가 없을 떄는 PVC에 정의된 원하는 용량과 가장 근접한 크기를 가진 PV를 연결(bind)해준다.
- kubectl get pvc
- kubectl get pv
- PV와 PVC 둘다 잘 생성되었다.
vi nfs-pvc-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-pvc-deploy
spec:
replicas: 4
selector:
matchLabels:
app: nfs-pvc-deploy
template:
metadata:
labels:
app: nfs-pvc-deploy
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: nfs-vol
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-vol
persistentVolumeClaim:
claimName: nfs-pvc
- kubectl apply -f nfs-pvc-deploy.yaml
- kubectl get pod
- 이전 deployment의 pod들이 다보인다.
- kubectl delete deployment [deployment이름] 으로 정리해준다.
- 이번 nfs-pvc-deploy만 남았다.
- kubectl get all
- 이름이 연결되어있다.
- Worker노드에서
df -h
옵션으로 확인하면, 잘 마운트 되어있다.
여기에 서비스 추가하기
kubectl expose deployment nfs-pvc-deploy --type=LoadBalancer --name=nfs-pvc-deploy-svc --external-ip=[masterIP] --port=80
pod 삭제해보기
- echo명령어로 /nfs_shared 디렉토리에 파일을 하나 생성한다.
kubectl delete deployment --all
kubectl delete pvc nfs-pvc
- 위 두개를 삭제한다.
- 어느정도의 시간이 걸리고, 위처럼 파일이 삭제되었다.
IP체계를 다시 바꾸는 방법
- VM을 모두 poweroff 시킨다.
Master, Worker
- 위처럼 랜카드 2개를 사용해서 네트워크를 꾸며준다.
- 이러면 모든 VM의 IP주소가 바뀌었을 것이다.
- MobaXterm의 주소를 바꿔주고,
- 또, 쿠버네티스
/etc/hosts
경로의 정보를 바꿔줘야한다.
[새로바뀐IP] master1
[새로바뀐IP] worker1
[새로바뀐IP] worker2
- 이렇게 hostname(master1, worker1, worker2)으로 ping이 나가야 한다.
모든 노드 설정
- 위 연결을 확인하고,
kubeadm reset
해준다.
마스터 노드 설정
kubeadm init --apiserver-advertise-address=[마스터IP] --pod-network-cidr=10.244.0.0/16
- IP가 바뀌었으니 abm, 즉 권한설정을 초기화 해준다.
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
- flannel, 노드끼리 서로 통신할 수 있는 유틸리티를 실행해준다.
- Create가 되는것을 보니 초기화할때 사라지는 것 같다.
worker노드
- init할 떄 생성된 join 명령어를 worker에 입력해준다.
모든노드
- 현재 사설 레지스트리도 이전 IP주소로 되어있을 것이다.
- 새로 바뀐 마스터의 IP를 넣어준다.
vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"insecure-registries":["192.168.56.101:5000"]
}
systemctl restart docker
- VM들도 모두 poweroff해준다.
연결확인
kubectl get po
- kubectl get pod와 같다.
오후강의
multi-container
- mkdir test && cd $_
- docker pull centos:7
- docker tag [masterIP]:5000/centos:7
- docker push [masterIP]:5000/centos:7
vi multipod.yaml
apiVersion: v1
kind: Pod
metadata:
name: multipod
spec:
containers:
- name: nginx-container
image: 192.168.56.101:5000/nginx:latest
ports:
- containerPort: 80
- name: centos-container
image: 192.168.56.101:5000/centos:7
command:
- sleep
- "10000"
- kubectl apply -f multipod.yaml
- 현재 nginx-container와 centos-container를 두개를 만들었다.
- kubectl exec -it multipod -c nginx-container -- bash
- 위 명령어로 nginx-container로 접속해보았다.
- bash명령어를 입력할 수 있었고, yum 명령어가 존재하지 않는다. => yum이 없다 -> centos가 아니다. -> nginx 컨테이너다.
- kubectl exec -it multipod -c centos-container -- bash
- 반대로 centos 컨테이너로 들어가서 yum을 입력하면 존재하는것을 확인할 수 있다.
Word Press
vi wordpress-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
name: wordpress-pod
labels:
app: wordpress-pod
spec:
containers:
- name: mysql-container
image: mysql:5.7
env:
- name: MYSQL_ROOT_HOST
value: '%'
- name: MYSQL_ROOT_PASSWORD
value: kosa0401
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wpuser
- nmae: MYSQL_PASSWORD
value: wppass
ports:
- containerPort: 3306
command:
- sleep
- "60"
- name: wordpress-container
image: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-pod:3306
- name: WORDPRESS_DB_USER
value: wpuser
- name: WORDPRESS_DB PASSWORD
value: wppass
- name: WORDPRESS_DB_NAME
value: wordpress
ports:
- containerPort: 80
- kubectl apply -f wordpress-pod-svc.yaml
- kubectl get pod
- wordpess-pod이 조금 대기시간이 길었지만 잘 running중이다
방금전 워드프레스 코드에서..
apiVersion: v1
kind: ConfigMap ConfigMap을 사용한ㄴ다.
metadata:
namespace: metallb-system
name: config
data:
config: | address-pools로 이름을 nginx-ip-range라고 준다.
address-pools:
- name: nginx-ip-range
protocol: layer2
addresses:
- 192.168.56.101
- 192.168.56.104
- 192.168.56.105
kubectl apply -f metallb-l2config.yaml
kubectl describe configmaps -n metallb-system
- 범위를 확인한다.
- 서비스에 접속할 수 없어 정리하고 다시해본다
- kubectl delete -f metallb-l2vonfig.yaml
- kubectl delete pod,svc --all
kubectl describe configmaps -n metallb-system
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx-pod
spec:
containers:
- name: nginx-pod-container
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service-pod
spec:
type: LoadBalancer
selector:
app: nginx-pod
ports:
- protocol: TCP
port: 80
targetPort: 80
kubectl apply -f metallb-test.yaml
- kubectl get svc로 방금생성한 loadbalancer-service-pod을 확인할 수 있다.
- metallb기능(DHCP와 비슷)으로 잘 접속되었다.
ConfigMap
- 컨피그맵은 키-값 쌍으로 기밀이 아닌 데이터를 저장하는데 사용하는 API 오브젝트 이다.
- pod는 볼륨에서 환경 변수, 커맨드-라인 인수 또는 구성 파일로 컨피그 맵을 사용할 수 있다.
- 컨피그맵으로 컨테이너 이미지에서 환경별 구성을 분리해, 애플리케이션을 쉽게 이식할 수 있다.
vi configmap-dev.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config-dev
namespace: default
data:
DB_URL: localhost
DB_USER: myuser
DB_PASS: mypass
DEBUG_INFO: debug
vi deployment-config01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: configapp
labels:
app: configapp
spec:
replicas: 1
selector:
matchLabels:
app: configapp
template:
metadata:
labels:
app: configapp
spec:
containers:
- name: testapp
image: 192.168.56.101:5000/nginx:ㅣlatest
ports:
- containerPort: 8080
env:
- name: DEBUG_LEVEL
valueFrom:
configMapKeyRef:
name: config-dev
key: DEBUG_INFO
---
apiVersion: v1
kind: Service
metadata:
labels:
app: configapp
name: configapp-svc
namespace: default
spec:
ports:
- nodePort: 30800
port: 8080
protocol: TCP
targetPort: 80
selector:
app: configapp