959 lines
20 KiB
Markdown
959 lines
20 KiB
Markdown
![]() |
```
|
|||
|
{
|
|||
|
wget -q --show-progress --https-only --timestamping \
|
|||
|
https://storage.googleapis.com/kubernetes-the-hard-way/cfssl/1.4.1/linux/cfssl \
|
|||
|
https://storage.googleapis.com/kubernetes-the-hard-way/cfssl/1.4.1/linux/cfssljson
|
|||
|
chmod +x cfssl cfssljson
|
|||
|
sudo mv cfssl cfssljson /usr/local/bin/
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
|
|||
|
cat > ca-config.json <<EOF
|
|||
|
{
|
|||
|
"signing": {
|
|||
|
"default": {
|
|||
|
"expiry": "8760h"
|
|||
|
},
|
|||
|
"profiles": {
|
|||
|
"kubernetes": {
|
|||
|
"usages": ["signing", "key encipherment", "server auth", "client auth"],
|
|||
|
"expiry": "8760h"
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
cat > ca-csr.json <<EOF
|
|||
|
{
|
|||
|
"CN": "Kubernetes",
|
|||
|
"key": {
|
|||
|
"algo": "rsa",
|
|||
|
"size": 2048
|
|||
|
},
|
|||
|
"names": [
|
|||
|
{
|
|||
|
"C": "US",
|
|||
|
"L": "Portland",
|
|||
|
"O": "Kubernetes",
|
|||
|
"OU": "CA",
|
|||
|
"ST": "Oregon"
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
|
|||
|
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Результат:
|
|||
|
```
|
|||
|
ca-key.pem
|
|||
|
ca.csr
|
|||
|
ca.pem
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
|
|||
|
KUBERNETES_HOSTNAMES=kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster,kubernetes.svc.cluster.local
|
|||
|
|
|||
|
cat > kubernetes-csr.json <<EOF
|
|||
|
{
|
|||
|
"CN": "kubernetes",
|
|||
|
"key": {
|
|||
|
"algo": "rsa",
|
|||
|
"size": 2048
|
|||
|
},
|
|||
|
"names": [
|
|||
|
{
|
|||
|
"C": "US",
|
|||
|
"L": "Portland",
|
|||
|
"O": "Kubernetes",
|
|||
|
"OU": "Kubernetes The Hard Way",
|
|||
|
"ST": "Oregon"
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
cfssl gencert \
|
|||
|
-ca=ca.pem \
|
|||
|
-ca-key=ca-key.pem \
|
|||
|
-config=ca-config.json \
|
|||
|
-hostname=worker,127.0.0.1,${KUBERNETES_HOSTNAMES} \
|
|||
|
-profile=kubernetes \
|
|||
|
kubernetes-csr.json | cfssljson -bare kubernetes
|
|||
|
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Завантажимо etcd
|
|||
|
```
|
|||
|
wget -q --show-progress --https-only --timestamping \
|
|||
|
"https://github.com/etcd-io/etcd/releases/download/v3.4.15/etcd-v3.4.15-linux-amd64.tar.gz"
|
|||
|
```
|
|||
|
|
|||
|
Розпакувати і помістити etcd у диреторію /usr/local/bin/
|
|||
|
```
|
|||
|
{
|
|||
|
tar -xvf etcd-v3.4.15-linux-amd64.tar.gz
|
|||
|
sudo mv etcd-v3.4.15-linux-amd64/etcd* /usr/local/bin/
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
{
|
|||
|
sudo mkdir -p /etc/etcd /var/lib/etcd
|
|||
|
sudo chmod 700 /var/lib/etcd
|
|||
|
sudo cp ca.pem \
|
|||
|
kubernetes.pem kubernetes-key.pem \
|
|||
|
/etc/etcd/
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
cat <<EOF | sudo tee /etc/systemd/system/etcd.service
|
|||
|
[Unit]
|
|||
|
Description=etcd
|
|||
|
Documentation=https://github.com/coreos
|
|||
|
|
|||
|
[Service]
|
|||
|
Type=notify
|
|||
|
ExecStart=/usr/local/bin/etcd \\
|
|||
|
--name etcd \\
|
|||
|
--cert-file=/etc/etcd/kubernetes.pem \\
|
|||
|
--key-file=/etc/etcd/kubernetes-key.pem \\
|
|||
|
--trusted-ca-file=/etc/etcd/ca.pem \\
|
|||
|
--client-cert-auth \\
|
|||
|
--listen-client-urls https://127.0.0.1:2379 \\
|
|||
|
--advertise-client-urls https://127.0.0.1:2379 \\
|
|||
|
--data-dir=/var/lib/etcd
|
|||
|
Restart=on-failure
|
|||
|
RestartSec=5
|
|||
|
|
|||
|
[Install]
|
|||
|
WantedBy=multi-user.target
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
sudo systemctl daemon-reload
|
|||
|
sudo systemctl enable etcd
|
|||
|
sudo systemctl start etcd
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
sudo ETCDCTL_API=3 etcdctl member list \
|
|||
|
--endpoints=https://127.0.0.1:2379 \
|
|||
|
--cacert=/etc/etcd/ca.pem \
|
|||
|
--cert=/etc/etcd/kubernetes.pem \
|
|||
|
--key=/etc/etcd/kubernetes-key.pem
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
api server
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
cat > service-account-csr.json <<EOF
|
|||
|
{
|
|||
|
"CN": "service-accounts",
|
|||
|
"key": {
|
|||
|
"algo": "rsa",
|
|||
|
"size": 2048
|
|||
|
},
|
|||
|
"names": [
|
|||
|
{
|
|||
|
"C": "US",
|
|||
|
"L": "Portland",
|
|||
|
"O": "Kubernetes",
|
|||
|
"OU": "Kubernetes The Hard Way",
|
|||
|
"ST": "Oregon"
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
cfssl gencert \
|
|||
|
-ca=ca.pem \
|
|||
|
-ca-key=ca-key.pem \
|
|||
|
-config=ca-config.json \
|
|||
|
-profile=kubernetes \
|
|||
|
service-account-csr.json | cfssljson -bare service-account
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
cat > admin-csr.json <<EOF
|
|||
|
{
|
|||
|
"CN": "admin",
|
|||
|
"key": {
|
|||
|
"algo": "rsa",
|
|||
|
"size": 2048
|
|||
|
},
|
|||
|
"names": [
|
|||
|
{
|
|||
|
"C": "US",
|
|||
|
"L": "Portland",
|
|||
|
"O": "system:masters",
|
|||
|
"OU": "Kubernetes The Hard Way",
|
|||
|
"ST": "Oregon"
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
cfssl gencert \
|
|||
|
-ca=ca.pem \
|
|||
|
-ca-key=ca-key.pem \
|
|||
|
-config=ca-config.json \
|
|||
|
-profile=kubernetes \
|
|||
|
admin-csr.json | cfssljson -bare admin
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
cat > encryption-config.yaml <<EOF
|
|||
|
kind: EncryptionConfig
|
|||
|
apiVersion: v1
|
|||
|
resources:
|
|||
|
- resources:
|
|||
|
- secrets
|
|||
|
providers:
|
|||
|
- aescbc:
|
|||
|
keys:
|
|||
|
- name: key1
|
|||
|
secret: ${ENCRYPTION_KEY}
|
|||
|
- identity: {}
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
```
|
|||
|
sudo mkdir -p /etc/kubernetes/config
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
wget -q --show-progress --https-only --timestamping \
|
|||
|
"https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kube-apiserver"
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
{
|
|||
|
chmod +x kube-apiserver
|
|||
|
sudo mv kube-apiserver /usr/local/bin/
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
{
|
|||
|
sudo mkdir -p /var/lib/kubernetes/
|
|||
|
|
|||
|
sudo cp \
|
|||
|
ca.pem \
|
|||
|
kubernetes.pem kubernetes-key.pem \
|
|||
|
encryption-config.yaml \
|
|||
|
service-account-key.pem service-account.pem \
|
|||
|
/var/lib/kubernetes/
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
sudo mkdir -p /etc/kubernetes/config
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
```
|
|||
|
cat <<EOF | sudo tee /etc/systemd/system/kube-apiserver.service
|
|||
|
[Unit]
|
|||
|
Description=Kubernetes API Server
|
|||
|
Documentation=https://github.com/kubernetes/kubernetes
|
|||
|
|
|||
|
[Service]
|
|||
|
ExecStart=/usr/local/bin/kube-apiserver \\
|
|||
|
--advertise-address='91.107.220.4' \\
|
|||
|
--allow-privileged='true' \\
|
|||
|
--apiserver-count='3' \\
|
|||
|
--audit-log-maxage='30' \\
|
|||
|
--audit-log-maxbackup='3' \\
|
|||
|
--audit-log-maxsize='100' \\
|
|||
|
--audit-log-path='/var/log/audit.log' \\
|
|||
|
--authorization-mode='Node,RBAC' \\
|
|||
|
--bind-address='0.0.0.0' \\
|
|||
|
--client-ca-file='/var/lib/kubernetes/ca.pem' \\
|
|||
|
--enable-admission-plugins='NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota' \\
|
|||
|
--etcd-cafile='/var/lib/kubernetes/ca.pem' \\
|
|||
|
--etcd-certfile='/var/lib/kubernetes/kubernetes.pem' \\
|
|||
|
--etcd-keyfile='/var/lib/kubernetes/kubernetes-key.pem' \\
|
|||
|
--etcd-servers='https://127.0.0.1:2379' \\
|
|||
|
--event-ttl='1h' \\
|
|||
|
--encryption-provider-config='/var/lib/kubernetes/encryption-config.yaml' \\
|
|||
|
--kubelet-certificate-authority='/var/lib/kubernetes/ca.pem' \\
|
|||
|
--kubelet-client-certificate='/var/lib/kubernetes/kubernetes.pem' \\
|
|||
|
--kubelet-client-key='/var/lib/kubernetes/kubernetes-key.pem' \\
|
|||
|
--runtime-config='api/all=true' \\
|
|||
|
--service-account-key-file='/var/lib/kubernetes/service-account.pem' \\
|
|||
|
--service-cluster-ip-range='10.32.0.0/24' \\
|
|||
|
--service-node-port-range='30000-32767' \\
|
|||
|
--tls-cert-file='/var/lib/kubernetes/kubernetes.pem' \\
|
|||
|
--tls-private-key-file='/var/lib/kubernetes/kubernetes-key.pem' \\
|
|||
|
--service-account-signing-key-file='/var/lib/kubernetes/service-account-key.pem' \\
|
|||
|
--service-account-issuer='https://kubernetes.default.svc.cluster.local' \\
|
|||
|
--api-audiences='https://kubernetes.default.svc.cluster.local' \\
|
|||
|
--v='2'
|
|||
|
Restart=on-failure
|
|||
|
RestartSec=5
|
|||
|
|
|||
|
[Install]
|
|||
|
WantedBy=multi-user.target
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
sudo systemctl daemon-reload
|
|||
|
sudo systemctl enable kube-apiserver
|
|||
|
sudo systemctl start kube-apiserver
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
wget -q --show-progress --https-only --timestamping \
|
|||
|
https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubectl \
|
|||
|
&& chmod +x kubectl \
|
|||
|
&& sudo mv kubectl /usr/local/bin/
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
{
|
|||
|
kubectl config set-cluster kubernetes-the-hard-way \
|
|||
|
--certificate-authority=ca.pem \
|
|||
|
--embed-certs=true \
|
|||
|
--server=https://127.0.0.1:6443 \
|
|||
|
--kubeconfig=admin.kubeconfig
|
|||
|
|
|||
|
kubectl config set-credentials admin \
|
|||
|
--client-certificate=admin.pem \
|
|||
|
--client-key=admin-key.pem \
|
|||
|
--embed-certs=true \
|
|||
|
--kubeconfig=admin.kubeconfig
|
|||
|
|
|||
|
kubectl config set-context default \
|
|||
|
--cluster=kubernetes-the-hard-way \
|
|||
|
--user=admin \
|
|||
|
--kubeconfig=admin.kubeconfig
|
|||
|
|
|||
|
kubectl config use-context default --kubeconfig=admin.kubeconfig
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
kubectl version --kubeconfig=admin.kubeconfig
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
cat <<EOF> pod.yaml
|
|||
|
apiVersion: v1
|
|||
|
kind: Pod
|
|||
|
metadata:
|
|||
|
name: hello-world
|
|||
|
spec:
|
|||
|
serviceAccountName: hello-world
|
|||
|
containers:
|
|||
|
- name: hello-world-container
|
|||
|
image: busybox
|
|||
|
command: ['sh', '-c', 'while true; do echo "Hello, World!"; sleep 1; done']
|
|||
|
nodeName: worker
|
|||
|
EOF
|
|||
|
|
|||
|
cat <<EOF> sa.yaml
|
|||
|
apiVersion: v1
|
|||
|
kind: ServiceAccount
|
|||
|
metadata:
|
|||
|
name: hello-world
|
|||
|
automountServiceAccountToken: false
|
|||
|
EOF
|
|||
|
|
|||
|
kubectl apply -f sa.yaml --kubeconfig=admin.kubeconfig
|
|||
|
kubectl apply -f pod.yaml --kubeconfig=admin.kubeconfig
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
kubelet
|
|||
|
|
|||
|
????, ага ще напевно потрібно виписувати сертифікати на публічний айпішнік
|
|||
|
```bash
|
|||
|
sudo echo "127.0.0.1 worker" >> /etc/hosts
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
cat > kubelet-csr.json <<EOF
|
|||
|
{
|
|||
|
"CN": "system:node:worker",
|
|||
|
"key": {
|
|||
|
"algo": "rsa",
|
|||
|
"size": 2048
|
|||
|
},
|
|||
|
"names": [
|
|||
|
{
|
|||
|
"C": "US",
|
|||
|
"L": "Portland",
|
|||
|
"O": "system:nodes",
|
|||
|
"OU": "Kubernetes The Hard Way",
|
|||
|
"ST": "Oregon"
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
cfssl gencert \
|
|||
|
-ca=ca.pem \
|
|||
|
-ca-key=ca-key.pem \
|
|||
|
-config=ca-config.json \
|
|||
|
-hostname=127.0.0.1 \
|
|||
|
-profile=kubernetes \
|
|||
|
kubelet-csr.json | cfssljson -bare kubelet
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
sudo apt-get update
|
|||
|
sudo apt-get -y install socat conntrack ipset
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
sudo swapon --show
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
sudo swapoff -a
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
```bash
|
|||
|
wget -q --show-progress --https-only --timestamping \
|
|||
|
https://github.com/opencontainers/runc/releases/download/v1.0.0-rc93/runc.amd64 \
|
|||
|
https://github.com/containernetworking/plugins/releases/download/v0.9.1/cni-plugins-linux-amd64-v0.9.1.tgz \
|
|||
|
https://github.com/containerd/containerd/releases/download/v1.4.4/containerd-1.4.4-linux-amd64.tar.gz \
|
|||
|
https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kube-proxy \
|
|||
|
https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kubelet
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
```bash
|
|||
|
sudo mkdir -p \
|
|||
|
/etc/cni/net.d \
|
|||
|
/opt/cni/bin \
|
|||
|
/var/lib/kubelet \
|
|||
|
/var/lib/kube-proxy \
|
|||
|
/var/lib/kubernetes \
|
|||
|
/var/run/kubernetes
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
mkdir containerd
|
|||
|
tar -xvf containerd-1.4.4-linux-amd64.tar.gz -C containerd
|
|||
|
sudo tar -xvf cni-plugins-linux-amd64-v0.9.1.tgz -C /opt/cni/bin/
|
|||
|
sudo mv runc.amd64 runc
|
|||
|
chmod +x kube-proxy kubelet runc
|
|||
|
sudo mv kube-proxy kubelet runc /usr/local/bin/
|
|||
|
sudo mv containerd/bin/* /bin/
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
cat <<EOF | sudo tee /etc/cni/net.d/10-bridge.conf
|
|||
|
{
|
|||
|
"cniVersion": "0.4.0",
|
|||
|
"name": "bridge",
|
|||
|
"type": "bridge",
|
|||
|
"bridge": "cnio0",
|
|||
|
"isGateway": true,
|
|||
|
"ipMasq": true,
|
|||
|
"ipam": {
|
|||
|
"type": "host-local",
|
|||
|
"ranges": [
|
|||
|
[{"subnet": "10.240.1.0/24"}]
|
|||
|
],
|
|||
|
"routes": [{"dst": "0.0.0.0/0"}]
|
|||
|
}
|
|||
|
}
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
cat <<EOF | sudo tee /etc/cni/net.d/99-loopback.conf
|
|||
|
{
|
|||
|
"cniVersion": "0.4.0",
|
|||
|
"name": "lo",
|
|||
|
"type": "loopback"
|
|||
|
}
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
sudo mkdir -p /etc/containerd/
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
cat << EOF | sudo tee /etc/containerd/config.toml
|
|||
|
[plugins]
|
|||
|
[plugins.cri.containerd]
|
|||
|
snapshotter = "overlayfs"
|
|||
|
[plugins.cri.containerd.default_runtime]
|
|||
|
runtime_type = "io.containerd.runtime.v1.linux"
|
|||
|
runtime_engine = "/usr/local/bin/runc"
|
|||
|
runtime_root = ""
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
cat <<EOF | sudo tee /etc/systemd/system/containerd.service
|
|||
|
[Unit]
|
|||
|
Description=containerd container runtime
|
|||
|
Documentation=https://containerd.io
|
|||
|
After=network.target
|
|||
|
|
|||
|
[Service]
|
|||
|
ExecStartPre=/sbin/modprobe overlay
|
|||
|
ExecStart=/bin/containerd
|
|||
|
Restart=always
|
|||
|
RestartSec=5
|
|||
|
Delegate=yes
|
|||
|
KillMode=process
|
|||
|
OOMScoreAdjust=-999
|
|||
|
LimitNOFILE=1048576
|
|||
|
LimitNPROC=infinity
|
|||
|
LimitCORE=infinity
|
|||
|
|
|||
|
[Install]
|
|||
|
WantedBy=multi-user.target
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
kubectl config set-cluster kubernetes-the-hard-way \
|
|||
|
--certificate-authority=ca.pem \
|
|||
|
--embed-certs=true \
|
|||
|
--server=https://127.0.0.1:6443 \
|
|||
|
--kubeconfig=kubelet.kubeconfig
|
|||
|
|
|||
|
kubectl config set-credentials system:node:worker \
|
|||
|
--client-certificate=kubelet.pem \
|
|||
|
--client-key=kubelet-key.pem \
|
|||
|
--embed-certs=true \
|
|||
|
--kubeconfig=kubelet.kubeconfig
|
|||
|
|
|||
|
kubectl config set-context default \
|
|||
|
--cluster=kubernetes-the-hard-way \
|
|||
|
--user=system:node:worker \
|
|||
|
--kubeconfig=kubelet.kubeconfig
|
|||
|
|
|||
|
kubectl config use-context default --kubeconfig=kubelet.kubeconfig
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
sudo cp kubelet-key.pem kubelet.pem /var/lib/kubelet/
|
|||
|
sudo cp kubelet.kubeconfig /var/lib/kubelet/kubeconfig
|
|||
|
sudo cp ca.pem /var/lib/kubernetes/
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
cat <<EOF | sudo tee /var/lib/kubelet/kubelet-config.yaml
|
|||
|
kind: KubeletConfiguration
|
|||
|
apiVersion: kubelet.config.k8s.io/v1beta1
|
|||
|
authentication:
|
|||
|
anonymous:
|
|||
|
enabled: false
|
|||
|
webhook:
|
|||
|
enabled: true
|
|||
|
x509:
|
|||
|
clientCAFile: "/var/lib/kubernetes/ca.pem"
|
|||
|
authorization:
|
|||
|
mode: Webhook
|
|||
|
clusterDomain: "cluster.local"
|
|||
|
clusterDNS:
|
|||
|
- "10.32.0.10"
|
|||
|
podCIDR: "10.240.1.0/24"
|
|||
|
resolvConf: "/run/systemd/resolve/resolv.conf"
|
|||
|
runtimeRequestTimeout: "15m"
|
|||
|
tlsCertFile: "/var/lib/kubelet/kubelet.pem"
|
|||
|
tlsPrivateKeyFile: "/var/lib/kubelet/kubelet-key.pem"
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
cat <<EOF | sudo tee /etc/systemd/system/kubelet.service
|
|||
|
[Unit]
|
|||
|
Description=Kubernetes Kubelet
|
|||
|
Documentation=https://github.com/kubernetes/kubernetes
|
|||
|
After=containerd.service
|
|||
|
Requires=containerd.service
|
|||
|
|
|||
|
[Service]
|
|||
|
ExecStart=/usr/local/bin/kubelet \\
|
|||
|
--config=/var/lib/kubelet/kubelet-config.yaml \\
|
|||
|
--container-runtime=remote \\
|
|||
|
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \\
|
|||
|
--image-pull-progress-deadline=2m \\
|
|||
|
--kubeconfig=/var/lib/kubelet/kubeconfig \\
|
|||
|
--network-plugin=cni \\
|
|||
|
--register-node=true \\
|
|||
|
--hostname-override=worker \\
|
|||
|
--v=2
|
|||
|
Restart=on-failure
|
|||
|
RestartSec=5
|
|||
|
|
|||
|
[Install]
|
|||
|
WantedBy=multi-user.target
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
sudo systemctl daemon-reload
|
|||
|
sudo systemctl enable kubelet
|
|||
|
sudo systemctl start kubelet
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
kubectl get nodes --kubeconfig=admin.kubeconfig
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
kubectl get pod --kubeconfig=admin.kubeconfig
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
cat <<EOF> nginx-pod.yaml
|
|||
|
apiVersion: v1
|
|||
|
kind: Pod
|
|||
|
metadata:
|
|||
|
name: nginx-pod
|
|||
|
spec:
|
|||
|
serviceAccountName: hello-world
|
|||
|
containers:
|
|||
|
- name: nginx-container
|
|||
|
image: nginx
|
|||
|
ports:
|
|||
|
- containerPort: 80
|
|||
|
nodeName: worker
|
|||
|
EOF
|
|||
|
|
|||
|
|
|||
|
kubectl apply -f nginx-pod.yaml --kubeconfig=admin.kubeconfig
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
kubectl get pod nginx-pod --kubeconfig=admin.kubeconfig -o=jsonpath='{.status.podIP}'
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
curl $(kubectl get pod nginx-pod --kubeconfig=admin.kubeconfig -o=jsonpath='{.status.podIP}')
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
kubectl delete -f nginx-pod.yaml --kubeconfig=admin.kubeconfig
|
|||
|
kubectl delete -f pod.yaml --kubeconfig=admin.kubeconfig
|
|||
|
kubectl delete -f sa.yaml --kubeconfig=admin.kubeconfig
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
cat <<EOF> nginx-deployment.yaml
|
|||
|
apiVersion: apps/v1
|
|||
|
kind: Deployment
|
|||
|
metadata:
|
|||
|
name: nginx-deployment
|
|||
|
spec:
|
|||
|
replicas: 3
|
|||
|
selector:
|
|||
|
matchLabels:
|
|||
|
app: nginx
|
|||
|
template:
|
|||
|
metadata:
|
|||
|
labels:
|
|||
|
app: nginx
|
|||
|
spec:
|
|||
|
containers:
|
|||
|
- name: nginx-container
|
|||
|
image: nginx
|
|||
|
ports:
|
|||
|
- containerPort: 80
|
|||
|
EOF
|
|||
|
|
|||
|
kubectl apply -f nginx-deployment.yaml --kubeconfig=admin.kubeconfig
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
kubectl get pod --kubeconfig=admin.kubeconfig
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
kubectl get deployment --kubeconfig=admin.kubeconfig
|
|||
|
```
|
|||
|
такс деплоймент є а подів немає - неподобство
|
|||
|
|
|||
|
# controller manager
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
cat > kube-controller-manager-csr.json <<EOF
|
|||
|
{
|
|||
|
"CN": "system:kube-controller-manager",
|
|||
|
"key": {
|
|||
|
"algo": "rsa",
|
|||
|
"size": 2048
|
|||
|
},
|
|||
|
"names": [
|
|||
|
{
|
|||
|
"C": "US",
|
|||
|
"L": "Portland",
|
|||
|
"O": "system:kube-controller-manager",
|
|||
|
"OU": "Kubernetes The Hard Way",
|
|||
|
"ST": "Oregon"
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
cfssl gencert \
|
|||
|
-ca=ca.pem \
|
|||
|
-ca-key=ca-key.pem \
|
|||
|
-config=ca-config.json \
|
|||
|
-profile=kubernetes \
|
|||
|
kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
|
|||
|
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
kubectl config set-cluster kubernetes-the-hard-way \
|
|||
|
--certificate-authority=ca.pem \
|
|||
|
--embed-certs=true \
|
|||
|
--server=https://127.0.0.1:6443 \
|
|||
|
--kubeconfig=kube-controller-manager.kubeconfig
|
|||
|
|
|||
|
kubectl config set-credentials system:kube-controller-manager \
|
|||
|
--client-certificate=kube-controller-manager.pem \
|
|||
|
--client-key=kube-controller-manager-key.pem \
|
|||
|
--embed-certs=true \
|
|||
|
--kubeconfig=kube-controller-manager.kubeconfig
|
|||
|
|
|||
|
kubectl config set-context default \
|
|||
|
--cluster=kubernetes-the-hard-way \
|
|||
|
--user=system:kube-controller-manager \
|
|||
|
--kubeconfig=kube-controller-manager.kubeconfig
|
|||
|
|
|||
|
kubectl config use-context default --kubeconfig=kube-controller-manager.kubeconfig
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
wget -q --show-progress --https-only --timestamping \
|
|||
|
"https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kube-controller-manager"
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
chmod +x kube-controller-manager
|
|||
|
sudo mv kube-controller-manager /usr/local/bin/
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
sudo mv kube-controller-manager.kubeconfig /var/lib/kubernetes/
|
|||
|
sudo cp ca-key.pem /var/lib/kubernetes/
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
cat <<EOF | sudo tee /etc/systemd/system/kube-controller-manager.service
|
|||
|
[Unit]
|
|||
|
Description=Kubernetes Controller Manager
|
|||
|
Documentation=https://github.com/kubernetes/kubernetes
|
|||
|
|
|||
|
[Service]
|
|||
|
ExecStart=/usr/local/bin/kube-controller-manager \\
|
|||
|
--bind-address=0.0.0.0 \\
|
|||
|
--cluster-cidr=10.200.0.0/16 \\
|
|||
|
--cluster-name=kubernetes \\
|
|||
|
--cluster-signing-cert-file=/var/lib/kubernetes/ca.pem \\
|
|||
|
--cluster-signing-key-file=/var/lib/kubernetes/ca-key.pem \\
|
|||
|
--kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \\
|
|||
|
--leader-elect=true \\
|
|||
|
--root-ca-file=/var/lib/kubernetes/ca.pem \\
|
|||
|
--service-account-private-key-file=/var/lib/kubernetes/service-account-key.pem \\
|
|||
|
--service-cluster-ip-range=10.32.0.0/24 \\
|
|||
|
--use-service-account-credentials=true \\
|
|||
|
--v=2
|
|||
|
Restart=on-failure
|
|||
|
RestartSec=5
|
|||
|
|
|||
|
[Install]
|
|||
|
WantedBy=multi-user.target
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
sudo systemctl daemon-reload
|
|||
|
sudo systemctl enable kube-controller-manager
|
|||
|
sudo systemctl start kube-controller-manager
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
```bash
|
|||
|
kubectl get pod --kubeconfig=admin.kubeconfig
|
|||
|
```
|
|||
|
такс, бачимо що наші поди створились
|
|||
|
але вони незапускаються ніяк
|
|||
|
|
|||
|
|
|||
|
# kube scheduler
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
|
|||
|
cat > kube-scheduler-csr.json <<EOF
|
|||
|
{
|
|||
|
"CN": "system:kube-scheduler",
|
|||
|
"key": {
|
|||
|
"algo": "rsa",
|
|||
|
"size": 2048
|
|||
|
},
|
|||
|
"names": [
|
|||
|
{
|
|||
|
"C": "US",
|
|||
|
"L": "Portland",
|
|||
|
"O": "system:kube-scheduler",
|
|||
|
"OU": "Kubernetes The Hard Way",
|
|||
|
"ST": "Oregon"
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
EOF
|
|||
|
|
|||
|
cfssl gencert \
|
|||
|
-ca=ca.pem \
|
|||
|
-ca-key=ca-key.pem \
|
|||
|
-config=ca-config.json \
|
|||
|
-profile=kubernetes \
|
|||
|
kube-scheduler-csr.json | cfssljson -bare kube-scheduler
|
|||
|
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
kubectl config set-cluster kubernetes-the-hard-way \
|
|||
|
--certificate-authority=ca.pem \
|
|||
|
--embed-certs=true \
|
|||
|
--server=https://127.0.0.1:6443 \
|
|||
|
--kubeconfig=kube-scheduler.kubeconfig
|
|||
|
|
|||
|
kubectl config set-credentials system:kube-scheduler \
|
|||
|
--client-certificate=kube-scheduler.pem \
|
|||
|
--client-key=kube-scheduler-key.pem \
|
|||
|
--embed-certs=true \
|
|||
|
--kubeconfig=kube-scheduler.kubeconfig
|
|||
|
|
|||
|
kubectl config set-context default \
|
|||
|
--cluster=kubernetes-the-hard-way \
|
|||
|
--user=system:kube-scheduler \
|
|||
|
--kubeconfig=kube-scheduler.kubeconfig
|
|||
|
|
|||
|
kubectl config use-context default --kubeconfig=kube-scheduler.kubeconfig
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
wget -q --show-progress --https-only --timestamping \
|
|||
|
"https://storage.googleapis.com/kubernetes-release/release/v1.21.0/bin/linux/amd64/kube-scheduler"
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
chmod +x kube-scheduler
|
|||
|
sudo mv kube-scheduler /usr/local/bin/
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
```bash
|
|||
|
sudo mv kube-scheduler.kubeconfig /var/lib/kubernetes/
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
cat <<EOF | sudo tee /etc/kubernetes/config/kube-scheduler.yaml
|
|||
|
apiVersion: kubescheduler.config.k8s.io/v1beta1
|
|||
|
kind: KubeSchedulerConfiguration
|
|||
|
clientConnection:
|
|||
|
kubeconfig: "/var/lib/kubernetes/kube-scheduler.kubeconfig"
|
|||
|
leaderElection:
|
|||
|
leaderElect: true
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
cat <<EOF | sudo tee /etc/systemd/system/kube-scheduler.service
|
|||
|
[Unit]
|
|||
|
Description=Kubernetes Scheduler
|
|||
|
Documentation=https://github.com/kubernetes/kubernetes
|
|||
|
|
|||
|
[Service]
|
|||
|
ExecStart=/usr/local/bin/kube-scheduler \\
|
|||
|
--config=/etc/kubernetes/config/kube-scheduler.yaml \\
|
|||
|
--v=2
|
|||
|
Restart=on-failure
|
|||
|
RestartSec=5
|
|||
|
|
|||
|
[Install]
|
|||
|
WantedBy=multi-user.target
|
|||
|
EOF
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
{
|
|||
|
sudo systemctl daemon-reload
|
|||
|
sudo systemctl enable kube-scheduler
|
|||
|
sudo systemctl start kube-scheduler
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
```bash
|
|||
|
kubectl get pod --kubeconfig=admin.kubeconfig
|
|||
|
```
|
|||
|
нарешті ми бачимо наші поди, вони запущені і ми навіть можемо перевірити чи вони працюють
|
|||
|
|
|||
|
|
|||
|
```bash
|
|||
|
curl $(kubectl get pods -l app=nginx --kubeconfig=admin.kubeconfig -o=jsonpath='{.items[0].status.podIP}')
|
|||
|
```
|
|||
|
чотко, бачимо що запустилось і працює
|