Infra/Kubernetes

kubernetes 2

서머스 2022. 7. 16. 09:35

모든 노드에 공통으로 다운로드 한다.

# 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노드들에게 준다.

init했을 때 나오는 명령어 1

세 개의 명령어가 나오는데, 입력한다.

# 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

 

 

init했을 때 나오는 명령어 2

그 토큰을 이용해서 접근할 수 있다.

이 명령어를 복사해서 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