[cloud native theme-24]: k8s - detailed interpretation of kubernetes (k8s) master cluster construction and installation process - Installation of initial control node

Author home page( Silicon based workshop of slow fire rock sugar): Wenhuo rock sugar (Wang Wenbing) blog_ Silicon based workshop of slow fire rock sugar_ CSDN blog

Website of this article: https://blog.csdn.net/HiWangWenBing/article/details/122759250

catalogue

Step 1: Cluster Planning

1.1 official structure of k8s

1.2 experimental architecture of k8s

1.3 main steps

1.4 K8S cluster construction mode selection

1.5 official references

Step 2: build ECS

2.1 installing the server

2.2 post installation inspection

Step 3: set up Docker environment (manual operation of cloud platform)

3.1 # install docker environment for each virtual server

3.2 start docker environment for each virtual server

3.3 modify docker configuration for K8S

Step 4: preparation before K8 installation

4.1 turn off the firewall

4.2} close swap

4.3. Set the static IP address of Intranet

4.4 # configure IPtable traffic bridge

Step 5: build cluster K8S Initial Mananger node

5.1 install kubedm, kubectl (unique to mananger node) and kubelet

5.2 google_containers configuration (optional)

5.3 kubedm init create leader mananger node

Step 6: kubedm init post processing: create kube configuration file

6.2 installation of third-party network plug-ins

6.3. Check the installation of nodes

Step 1: Cluster Planning

1.1 official structure of k8s

1.2 experimental architecture of k8s

Build a cluster network with 2 mananger nodes and 3 # worker nodes.

1.3 main steps

Step 1: install the initial mananger node

Step 2: install the worker node

Step 3: install other mananger nodes

1.4 K8S cluster construction mode selection

Mode 1: minicube

Minicube can run Kubernetes tools locally. Minicube can run a single node Kubernetes cluster on personal computers (including Windows, macOS and Linux PC s), so that you can try Kubernetes or carry out daily development work;

Hello Minikube | Kubernetes

Mode 2: kind

Tools like Kind and minicube allow you to run Kubernetes on your local computer. This tool needs to install and configure Docker;

Mode 3: kubedm

Kubedm is a K8s deployment tool that provides kubedm init and kubedm join commands to quickly deploy a Kubernetes cluster;

This paper chooses the third way

kubeadm is a tool launched by the official community for rapid deployment of kubernetes cluster. This tool can complete the deployment of a kubernetes cluster through two instructions;

(1) Create a Mananger leader node

$ kubeadm init

(2) Join the Node to the Master cluster

$kubedm join < IP and port of master node >

Therefore, it needs to be installed on both the Mananger node and the worker node.

Mode 4: binary package

Download the binary package of the distribution from Github, manually deploy and install each component and form a Kubernetes cluster. The steps are cumbersome, but it can make you have a clearer understanding of each component;

Mode 5: yum install

Install each component of Kubernetes through yum to form a Kubernetes cluster. However, the k8s version in yum source is relatively old, so this method is rarely used;

Mode 6: third party tools

Some great gods have encapsulated some tools, and use these tools to install the k8s environment;

Method 7: spend money to buy

Directly purchase a k8s public cloud platform like Alibaba cloud, and you can do it with one click;

1.5 official references

Kubeadm | Kubernetes

Installing kubeadm | Kubernetes

Step 2: build ECS

2.1 installing the server

(1) Server

  • Create one server (you can also create five servers, two mananger nodes and three worker nodes at one time)
  • All servers are on the same default network
  • CPU: 2-core 4G
  • Standard shared (offset)
  • Operating system: Alibaba Cloud Linux (fully compatible with CentOS, it is not recommended to install CentOS, because the official CentOS has not been supported and cannot support new functions)

(2) Network

  • Assign public IP address
  • Default VPC
  • Use by traffic, 1M bandwidth

(3) Default security group

  • Set the user name and password of the public network remote service server
  • Add ports 80 and 8080 for subsequent nginx service testing.

2.2 post installation inspection

(1) Log in to each server through public IP

 

(2) Role the server: initial mananger

Public IP address: 47.99.96.250

Private IP address: 172.24.130.172

(3) Modify host name

The purpose of modifying the host name is to access the host through the host name later, rather than through the IP address.

Of course, if you need to access through the host name, you also need to modify the configuration to realize the mapping between the host name and IP address.

hostnamectl set-hostname k8s-master1

(4) Establish a mapping table between host name and IP address to access the host through host name

$ vim /etc/hosts
172.24.130.172 k8s-master1

172.24.130.172 etcd
172.24.130.172 registry
172.24.130.172 cluster-endpoint

(5) Install ifconfig and ping tools (for hosts without ping tools)

$ yum install -y yum-utils

$ yum install iputils

$ yum install net-tools.x86_64

(6) You can ping through private IP

ping k8s-master1
ping cluster-endpoint

Step 3: set up Docker environment (manual operation of cloud platform)

CentOS Docker installation - rookie tutorial

How nodes work | Docker Documentation

3.1 # install docker environment for each virtual server

(1) ssh to virtual server

(2) One click installation of docker environment

The yum config manager command is used to add, delete, modify and query the warehouse (/ etc/yum.repos.d /)
This command is not installed by default. It is in the yum utils package and can be installed through Yum install - y Yum utils

yum repolist all # Show all repositories
yum repolist enabled # Show all started repositories
yum repolist disabled # Show all disabled repositories
# Add Alibaba cloud image repo
$ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# Tsinghua mirror
$ yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

# Official image
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

(3) Manual non one click installation

# uninstall
$ yum remove docker-ce
$ rm -rf /var/lib/docker

# Non one click installation of the latest version
yum install docker-ce docker-ce-cli containerd.io

# Non one click installation of the specified version
# Install a specific version through its complete package name, which is the package name (docker CE) plus the version string (second column),
# From the first colon (:) to the first hyphen, separated by a hyphen (-).
# For example: docker-ce-18.09.1.
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

3.2 start docker environment for each virtual server

$ systemctl start docker

$ docker version

$ docker ps

$ docker images

$ docker info

3.3 modify docker configuration for K8S

$ vim /etc/docker/daemon.json
>>
{ 
  "registry-mirrors": ["https://obww7jh1.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}

"Exec opts": ["native. Cgroupdriver = SYSTEMd"] is required by K8S.

Limited K8S program runs in the background in the way of systemd.

# Restart docker
$ systemctl daemon-reload
$ systemctl restart docker

Step 4: preparation before K8 installation

4.1 turn off the firewall

The reason why the firewall should be closed is that the machines in the cluster need to communicate through the private network. If the firewall is not closed, the communication of the machines in the cluster may fail. When the K8S installation fails, it is difficult to locate the problem.

$ Temporarily disabled
$ systemctl stop firewalld
$ systemctl disable firewalld

# Setenforce is the selinux firewall configuration command of Linux. Executing setenforce 0 means closing the selinux firewall)
$ setenforce 0

# Permanently disabled
$ vim /etc/selinux/config
SELINUX=disabled

iptables firewall will filter and forward all network traffic. If it is an intranet machine, it will generally be closed directly, which will affect the network performance. However, k8s cannot be closed directly. K8s needs to be forwarded and modified by firewall. Of course, it also depends on the network mode used. If the network mode adopted does not need firewall, it can be closed directly.

4.2} close swap

Swap partition, in English, is swap, which means "exchange" and "physical transaction". Its function is that when the memory is insufficient, the operating system first saves the temporarily unused data in the memory into the exchange space of the hard disk to free up the memory for other programs to run, which is the same as the function of Windows virtual memory (pagefile.sys).

Store part of the memory data in the disk, which will degrade the performance. For performance consideration, it is recommended to turn off and increase the memory.

# Temporarily Closed
$ swapoff -a

# Permanent closure
$ vim /etc/fstab
>>
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

# Use free -m to confirm that swap is closed. The swap part is 0
$ free -m

4.3. Set the static IP address of Intranet

(1) ipconfig view network card name

(2) VIM / etc / sysconfig / network scripts / ifcfg - network card name

Modify the IP address according to the actual situation of your system.

master to configure:
BOOTPROTO="static" # 
IPADDR="172.24.130.170" # IP
NETMASK="255.255.248.0" # mask
#GATEWAY="172.24.130.1" # Gateway address (using route -n, the first line is the default gateway)
#DNS1="8.8.8.8" # DNS server (cat /etc/resolv.conf view)

4.4 # configure IPtable traffic bridge

Method 1 (recommended)

$ cd /etc/sysctl.d
$ touch k8s.conf
$ vim k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0

# Make the configuration file effective
$ modprobe br_netfilter
$ sysctl --system -p /etc/sysctl.d/k8s.conf

Method 2:

For RHEL/CentOS 7 , systems, network requests can be routed incorrectly because , iptables , are bypassed. Therefore, you also need to execute the following command to ensure that # net is in # sysctl # configuration bridge. Bridge NF call iptables is set to 1.

$ vi /etc/sysctl.conf

# Add the following
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

$ sysctl --system

Step 5: build cluster K8S Initial Mananger node

5.1 install kubedm, kubectl (unique to mananger node) and kubelet

(1) Modify K8S configuration: yum source for K8S (kubernetes.repo)

$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

(2) Install kubedm, kubectl and kubelet

$ yum install -y kubelet kubeadm kubectl

# kubelet needs to be started manually
$ systemctl enable --now kubelet

The reason why kubelet can be deployed on the master is that K8S supports the deployment of clusters on a single machine. If you do not deploy clusters on a single machine, you do not need to install kubelet on the master.

Note: in addition to the above three components, other components exist in the form of container image and are deployed in the form of container. Therefore, they can be downloaded locally manually through dock pull first. Otherwise, kubedm init will actively download remotely.

(3) Check the status of kubelet

$ systemctl status kubelet

If kubelet is installed on the master, the status is not ready at this time.

5.2 google_containers configuration (optional)

Since coredns is renamed coredns/coredns, enter the following command before kubernetes init.

$ docker pull coredns/coredns:latest
$ docker tag coredns/coredns:latest registry.aliyuncs.com/google_containers/coredns:latest

The purpose of DNS is to access the host through the domain name.

5.3 kubedm init create leader mananger node

(1) Reset

# If there is a problem in the initialization process, use the following command to reset
$ kubeadm reset
$ rm -rf /var/lib/cni/
$ rm -f $HOME/.kube/config
$ systemctl daemon-reload && systemctl restart kubelet

(2) Command

# Ensure that the master master node can be accessed by name
$ ping cluster-endpoint

kubeadm init --apiserver-advertise-address 172.24.130.172 --control-plane-endpoint cluster-endpoint  --image-repository registry.aliyuncs.com/google_containers --service-cidr 10.1.0.0/16 --pod-network-cidr 192.168.0.0/16
  • Apiserver advertisement address: the address of the API server
  • Control plane endpoint: the address of the control plane, that is, the address of the leader master
  • Image repository: where is the repository where the docker image of the K8S component is located
  • Kubernetes version: version of K8S
  • Service CIDR: Specifies the range of service address, which cannot overlap with the network address of the host.
  • Pod network CIDR: specifies k8s the IP network range that can be used by the network between the internal pod nodes. It cannot overlap with the IP address range of the host. Cannot overlap with service CIDR.

(3) Output

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join cluster-endpoint:6443 --token ywv88r.v66vfltjx71o1m78 \
        --discovery-token-ca-cert-hash sha256:0960bd69ebf10fbfeba8b630cc827c7345558a5ae24e110cf125930440805f9f \
        --control-plane 

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

kubeadm join cluster-endpoint:6443 --token ywv88r.v66vfltjx71o1m78 \
        --discovery-token-ca-cert-hash sha256:0960bd69ebf10fbfeba8b630cc827c7345558a5ae24e110cf125930440805f9f 

As can be seen from the above:

There are two ways to join the cluster as a control plane node:

kubeadm join cluster-endpoint:6443 --token ywv88r.v66vfltjx71o1m78 \
        --discovery-token-ca-cert-hash sha256:0960bd69ebf10fbfeba8b630cc827c7345558a5ae24e110cf125930440805f9f \
        --control-plane 

Join the cluster as a normal node:

kubeadm join cluster-endpoint:6443 --token ywv88r.v66vfltjx71o1m78 \
        --discovery-token-ca-cert-hash sha256:0960bd69ebf10fbfeba8b630cc827c7345558a5ae24e110cf125930440805f9f 

(3) View node status

[root@k8s-master1 ~]# kubectl get nodes

NAME          STATUS   ROLES                  AGE   VERSION
k8s-master1   Ready    control-plane,master   19h   v1.23.3

Step 6: kubedm init post processing: create kube configuration file

According to the output result prompt of initialization, further processing is as follows.

6.1 modifying configuration files

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

6.2 installation of third-party network plug-ins

Installing Addons | Kubernetes

The purpose of network plug-in is to virtualize the k8s network into a network, provide a unified interface externally, and internally realize load balancing and network policy management.

K8S supports a variety of network strategies. Choose one according to your needs. Take calico plug-in as an example

# Download profile
curl https://docs.projectcalico.org/manifests/calico.yaml -O

# Install according to the configuration file
$ kubectl apply -f calico.yaml

6.3. Check the installation of nodes

(1) View component deployment

$ docker images

[root@k8s-master1 ~]# docker images
REPOSITORY                                                        TAG       IMAGE ID       CREATED         SIZE
kubernetesui/dashboard                                            v2.5.0    57446aa2002e   21 hours ago    223MB
calico/kube-controllers                                           v3.22.0   df76d42861ee   5 days ago      132MB
calico/cni                                                        v3.22.0   f86797de8afd   5 days ago      235MB
calico/pod2daemon-flexvol                                         v3.22.0   59daef946c8c   5 days ago      21.4MB
calico/node                                                       v3.22.0   f109b1742d34   5 days ago      213MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.23.3   f40be0088a83   9 days ago      135MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.23.3   99a3486be4f2   9 days ago      53.5MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.23.3   b07520cd7ab7   9 days ago      125MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.23.3   9b7cc9982109   9 days ago      112MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.23.0   e6bf5ddd4098   8 weeks ago     135MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.23.0   e03484a90585   8 weeks ago     112MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.23.0   37c6aeb3663b   8 weeks ago     125MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.23.0   56c5af1d00b5   8 weeks ago     53.5MB
registry.aliyuncs.com/google_containers/etcd                      3.5.1-0   25f8c7f3da61   3 months ago    293MB
coredns/coredns                                                   latest    a4ca41631cc7   4 months ago    46.8MB
registry.aliyuncs.com/google_containers/coredns                   latest    a4ca41631cc7   4 months ago    46.8MB
registry.aliyuncs.com/google_containers/coredns                   v1.8.6    a4ca41631cc7   4 months ago    46.8MB
registry.aliyuncs.com/google_containers/pause                     3.6       6270bb605e12   5 months ago    683kB
kubernetesui/metrics-scraper                                      v1.0.7    7801cfc6d5c0   7 months ago    34.4MB
calico/node                                                       v3.8.9    ee86d6374c0e   20 months ago   190MB
calico/pod2daemon-flexvol                                         v3.8.9    c3fc7e2b20f8   20 months ago   9.37MB
calico/cni                                                        v3.8.9    ab4bfb784a04   20 months ago   161MB
$ docker ps

[root@k8s-master1 ~]# docker ps
CONTAINER ID   IMAGE                                               COMMAND                  CREATED       STATUS       PORTS     NAMES
50c72aebaa12   kubernetesui/dashboard                              "/dashboard --insecu Holmium 2 hours ago   Up 2 hours             k8s_kubernetes-dashboard_kubernetes-dashboard-546cbc58cd-c55gt_kubernetes-dashboard_c4bbfd43-fd5a-4577-822f-dd762ead45d7_1
9be049fc07f2   7801cfc6d5c0                                        "/metrics-sidecar"       2 hours ago   Up 2 hours             k8s_dashboard-metrics-scraper_dashboard-metrics-scraper-799d786dbf-dkm47_kubernetes-dashboard_cd386835-f902-42bf-8032-178e2185f0d2_1
31d79f2f6062   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago   Up 2 hours             k8s_POD_dashboard-metrics-scraper-799d786dbf-dkm47_kubernetes-dashboard_cd386835-f902-42bf-8032-178e2185f0d2_2
245140693ea8   a4ca41631cc7                                        "/coredns -conf /etc Holmium 2 hours ago   Up 2 hours             k8s_coredns_coredns-6d8c4cb4d-rxjh9_kube-system_bd934648-b339-422c-8d54-9498eeffd779_2
f9d212219f0d   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago   Up 2 hours             k8s_POD_coredns-6d8c4cb4d-rxjh9_kube-system_bd934648-b339-422c-8d54-9498eeffd779_3
2226f35ec84a   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago   Up 2 hours             k8s_POD_kubernetes-dashboard-546cbc58cd-c55gt_kubernetes-dashboard_c4bbfd43-fd5a-4577-822f-dd762ead45d7_2
4cec84eb3f60   a4ca41631cc7                                        "/coredns -conf /etc Holmium 2 hours ago   Up 2 hours             k8s_coredns_coredns-6d8c4cb4d-mcjv8_kube-system_0063b61b-665e-4d78-963a-589d0803a1cd_2
e9bf3939136f   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago   Up 2 hours             k8s_POD_coredns-6d8c4cb4d-mcjv8_kube-system_0063b61b-665e-4d78-963a-589d0803a1cd_3
1aba8d3d08b4   df76d42861ee                                        "/usr/bin/kube-contr Holmium 2 hours ago   Up 2 hours             k8s_calico-kube-controllers_calico-kube-controllers-566dc76669-2pkhv_kube-system_c73d1b6c-87ff-4a24-9dc7-7bb4bbf07974_2
0e28c90b846f   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago   Up 2 hours             k8s_POD_calico-kube-controllers-566dc76669-2pkhv_kube-system_c73d1b6c-87ff-4a24-9dc7-7bb4bbf07974_3
91f095f298fc   f109b1742d34                                        "start_runit"            2 hours ago   Up 2 hours             k8s_calico-node_calico-node-cc8sp_kube-system_cdd6318b-3294-4cb8-8c89-73b195ff6be2_2
40f3b32fd608   9b7cc9982109                                        "/usr/local/bin/kube Holmium 2 hours ago   Up 2 hours             k8s_kube-proxy_kube-proxy-9z2bm_kube-system_0ba93fb4-84f9-4ad6-875e-038ce92423af_2
e19b019440b4   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago   Up 2 hours             k8s_POD_kube-proxy-9z2bm_kube-system_0ba93fb4-84f9-4ad6-875e-038ce92423af_2
29c1049c94f6   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago   Up 2 hours             k8s_POD_calico-node-cc8sp_kube-system_cdd6318b-3294-4cb8-8c89-73b195ff6be2_2
b31b5b9ccb11   f40be0088a83                                        "kube-apiserver --ad Holmium 2 hours ago   Up 2 hours             k8s_kube-apiserver_kube-apiserver-k8s-master1_kube-system_d27f2ab65f6952657233a6ae00cbce0a_6
2c47614454b5   b07520cd7ab7                                        "kube-controller-man Holmium 2 hours ago   Up 2 hours             k8s_kube-controller-manager_kube-controller-manager-k8s-master1_kube-system_f750c0e63deed088ac51fe880b38e1f4_4
5ce3dff0fafd   99a3486be4f2                                        "kube-scheduler --au Holmium 2 hours ago   Up 2 hours             k8s_kube-scheduler_kube-scheduler-k8s-master1_kube-system_0969a4e217156cc73dc6871a8d553e2b_6
08855ff00204   25f8c7f3da61                                        "etcd --advertise-cl Holmium 2 hours ago   Up 2 hours             k8s_etcd_etcd-k8s-master1_kube-system_4ec6d8e85dd87c17347b8e69a6b9d597_7
83045d940224   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago   Up 2 hours             k8s_POD_kube-apiserver-k8s-master1_kube-system_d27f2ab65f6952657233a6ae00cbce0a_2
e0d967f87f46   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago   Up 2 hours             k8s_POD_kube-controller-manager-k8s-master1_kube-system_f750c0e63deed088ac51fe880b38e1f4_2
fef32d3cb851   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago   Up 2 hours             k8s_POD_kube-scheduler-k8s-master1_kube-system_0969a4e217156cc73dc6871a8d553e2b_2
e53ca7115a40   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago   Up 2 hours             k8s_POD_etcd-k8s-master1_kube-system_4ec6d8e85dd87c17347b8e69a6b9d597_2
[root@k8s-master1 ~]# 

(2) View the node status of the cluster on the master node

# View nodes in the cluster
$ kubectl get nodes
[root@k8s-master1 ~]#  kubectl get nodes
NAME          STATUS   ROLES                  AGE   VERSION
k8s-master1   Ready    control-plane,master   20h   v1.23.3

# View services in the cluster
$ kubectl get pods -A

# Periodic view
$ watch -n 1 kubectl get pods -A

Author home page( Silicon based workshop of slow fire rock sugar): Wenhuo rock sugar (Wang Wenbing) blog_ Silicon based workshop of slow fire rock sugar_ CSDN blog

Website of this article: https://blog.csdn.net/HiWangWenBing/article/details/122759250

Keywords: Kubernetes Cloud Native

Added by crimsonmoon on Fri, 04 Feb 2022 15:02:11 +0200