모든 노드에 공통으로 다운로드 한다.
# hostnamectl set-hostname master
# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/docker-ce.repo
# yum --enablerepo=docker-ce-stable -y install docker-ce-19.03.15-3.el7
# mkdir /etc/docker
# cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# systemctl enable --now docker
# systemctl daemon-reload
# systemctl restart docker
# systemctl disable --now firewalld
# setenforce 0
# sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
# swapoff -a
# sed -i '/ swap / s/^/#/' /etc/fstab
swap공간을 오픈시켜야 쿠버네티스를 사용할 수 있다.
영구적으로 하기 위해 /etc/fstab의 제일 마지막 부분을 주석처리한다.
# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl --system
# reboot
# cat <<EOF > /etc/sysctl.d/k8s.conf # kubernetes에서 k와 s사이 8글자, 약칭으로 k8s.로 부른다.
cat <<'EOF' > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
# [kubernetes]
쿠버네티스 저장소에 대한 설명
# yum -y install kubeadm-1.19.16-0 kubelet-1.19.16-0 kubectl-1.19.16-0 --disableexcludes=kubernetes
# systemctl enable kubelet
설치를 마친 후 이 VM을 복제한다.
# cat <<EOF >> /etc/hosts
192.168.0.189 master1
192.168.1.199 worker1
192.168.1.200 worker2
EOF
세 개의 VM에다 공통으로 실행한다.
Master1 노드
# kubeadm init --apiserver-advertise-address=192.168.0.189 --pod-network-cidr=10.244.0.0/16
kubeadm init : 토근 정보를 worker노드들에게 준다.
세 개의 명령어가 나오는데, 입력한다.
# 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
그 토큰을 이용해서 접근할 수 있다.
이 명령어를 복사해서 worker node에 붙여넣기 한다.
Worker1, 2
kubeadm join 192.168.0.189:6443 --token 655zb7.cm8ec0hoxa7p514x \
--discovery-token-ca-cert-hash sha256:4328f565f4392dc640019d05b572505414d6ee7b4d7601baffbbdedde09dc00e
완료 후
master에서 node의 정보를 살펴보면 노드 세개가 올라와있다.
# kubectl get pods --all-namespaces
# source <(kubectl completion bash)
# echo "source <(kubectl completion bash)" >> ~/.bashrc
# exit
STATUS가 pending > ContainerCreating > Running 상태로 변한다.
스케줄러에 따라 어느 노드에 들어갔는지 알 수 있다.
노드를 하나 더 추가하면 worker1에 할당된다.
clsuterip 할당- cluster 내에 있는 노드들끼리 통신할 수 있다.
외부에서는 접속할 수 없다.
192.168.0.189:30506
http://192.168.1.199:30506/
http://192.168.1.200:30506/
로 접속해본다. master노드뿐만 아니라 worker노드의 아이피로도 접속 가능하다.
external ip에는 master1, worker1, worker2 아이피 아무거나 입력해도 된다.
external ip로 접속이 가능하다.
요소들 한꺼번에 삭제
nodeport 생성
nodeport는 어느 노드 아이피든간에, 포트 번호만 있으면 접속이 가능하다.
load balancer
vi loadbalancer-pod.yaml
3개의 노드의 ip를 입력한다
세 개의 ip에 들어가보면 다 접속된다...는데 나는 master 노드밖에 안됨 ㅠㅠ
docker swarm,
는 최소단위가 task, 여기서는 최소단위가 pod,
master1에는 pod를 스케주링 하지 안흔낟.pod를 배치시키지 않는다.
만약 pod가 네개가 되면 어떻게 배치될까?
4개가 되도록 desired 값을 바꿔본다.
kubectl edit replicaset
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-replicaset-nd8g5 1/1 Running 0 7m12s 10.244.2.16 worker2 <none> <none>
nginx-replicaset-r8wtl 1/1 Running 0 7m12s 10.244.2.15 worker2 <none> <none>
nginx-replicaset-rp8tq 1/1 Running 0 7m12s 10.244.1.13 worker1 <none> <none>
nginx-replicaset-zqbrv 1/1 Running 0 66s 10.244.1.14 worker1 <none> <none>
[root@master ~]# kubectl delete pod nginx-replicaset-rp9tq
Error from server (NotFound): pods "nginx-replicaset-rp9tq" not found
[root@master ~]# kubectl delete pod nginx-replicaset-rp8tq
pod "nginx-replicaset-rp8tq" deleted
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-replicaset-5vv9g 1/1 Running 0 10s 10.244.1.15 worker1 <none> <none>
nginx-replicaset-nd8g5 1/1 Running 0 7m49s 10.244.2.16 worker2 <none> <none>
nginx-replicaset-r8wtl 1/1 Running 0 7m49s 10.244.2.15 worker2 <none> <none>
nginx-replicaset-zqbrv 1/1 Running 0 103s 10.244.1.14 worker1 <none>
지워도 게속 다시 생긴다.
* Image의 STATUS가 Running중이 아닐 때
세 노드에서 docker의 daemon을 바꾼다.
# 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.0.50:5000"]
}
insecure-registries를 추가하고, 안에 ip는 master node의 ip이다.
systemctl restart docker
[root@master workspace]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-replicaset-dt9zj 0/1 ImagePullBackOff 0 17m
nginx-replicaset-gz6k4 0/1 ImagePullBackOff 0 17m
nginx-replicaset-qpllw 0/1 ImagePullBackOff 0 17m
[root@master workspace]# kubectl delete replicaset nginx-replicaset
replicaset.apps "nginx-replicaset" deleted
[root@master workspace]# kubectl get pod
No resources found in default namespace.
[root@master workspace]# kubectl apply -f replicaset.yaml
replicaset.apps/nginx-replicaset created
[root@master workspace]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-replicaset-nd8g5 0/1 ContainerCreating 0 6s
nginx-replicaset-r8wtl 1/1 Running 0 6s
nginx-replicaset-rp8tq 1/1 Running 0 6s
접속하기
vi clusterip-replicaset.yaml
apiVersion: v1
kind: Service
metadata:
name: clusterip-service-replicaset
spec:
type: ClusterIP
selector:
app: nginx-replicaset
ports:
- protocol: TCP
port: 80
targetPort: 80
접속이 된다.
[root@master workspace]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-replicaset-5vv9g 1/1 Running 0 19m
nginx-replicaset-nd8g5 1/1 Running 0 27m
nginx-replicaset-r8wtl 1/1 Running 0 27m
nginx-replicaset-zqbrv 1/1 Running 0 21m
[root@master workspace]# kubectl exec nginx-replicaset-5vv9g -- sh -c "echo "web01" > /usr/share/nginx/html
[root@master workspace]# kubectl exec nginx-replicaset-nd8g5 -- sh -c "echo "web02" > /usr/share/nginx/html/index.html"
[root@master workspace]# kubectl exec nginx-replicaset-r8wtl -- sh -c "echo "web03" > /usr/share/nginx/html/index.html"
[root@master workspace]# kubectl exec nginx-replicaset-zqbrv -- sh -c "echo "web04" > /usr/share/nginx/html/index.html"
pod에 접속하기
vi nodeport-replicaset.yaml
apiVersion: v1
kind: Service
metadata:
name: nodeport-service-replicaset
spec:
type: NodePort
selector:
app: nginx-replicaset
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
[root@master workspace]# kubectl apply -f nodeport-replicaset.yaml
service/nodeport-service-replicaset created
[root@master workspace]# curl 192.168.0.50:30080
web04
[root@master workspace]# curl 192.168.0.50:30080
web01
[root@master workspace]# curl 192.168.0.50:30080
web02
[root@master workspace]# curl 192.168.0.50:30080
web04
[root@master workspace]# curl 192.168.0.50:30080
web02
[root@master workspace]# curl 192.168.0.50:30080
web01
[root@master workspace]# curl 192.168.0.50:30080
web02
[root@master workspace]# curl 192.168.0.50:30080
web02
[root@master workspace]#
[root@master workspace]# curl 192.168.0.50:30080
web04
vi loadbalancer-replicaset.yaml
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service-replicaset
spec:
type: LoadBalancer
externalIPs:
- 192.168.0.50
- 192.168.0.51
- 192.168.0.52
selector:
app: nginx-replicaset
ports:
- protocol: TCP
port: 80
targetPort: 80
[root@master workspace]# kubectl apply -f loadbalancer-replicaset.yaml
service/loadbalancer-service-replicaset created
[root@master workspace]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
clusterip-service-replicaset ClusterIP 10.99.16.59 <none> 80/TCP 29m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 162m
loadbalancer-service-replicaset LoadBalancer 10.105.253.126 192.168.0.50,192.168.0.51,192.168.0.52 80:30105/TCP 4s
nodeport-service-replicaset NodePort 10.96.232.231 <none> 80:30080/TCP 10m
ReplicaSet -> Deployment
기본적이 운영 방식은 같지만, Deployment, Rollback 업데이트가 용이하다.
'Infra > Kubernetes' 카테고리의 다른 글
kubernetes 7 (0) | 2022.07.21 |
---|---|
kubernetes 5 (0) | 2022.07.20 |
kubernetes 4 (0) | 2022.07.19 |
kubernetes 3 (0) | 2022.07.18 |
Kubernetes 1 (0) | 2022.07.14 |