├── .gitignore ├── cluster1 ├── tmp │ └── .gitignore ├── down.sh ├── scripts │ ├── configure-master1.sh │ ├── update-dns.sh │ ├── install-worker.sh │ ├── set-hosts.sh │ ├── install-master.sh │ ├── install-kube.sh │ └── resources │ │ └── kube-scheduler-amazing.yaml ├── k8s │ ├── resources │ │ ├── namespaces.yaml │ │ ├── priority.yaml │ │ ├── namespaces │ │ │ ├── management │ │ │ │ ├── web-server.yaml │ │ │ │ ├── important-pod.yaml │ │ │ │ └── fillers.yaml │ │ │ ├── development │ │ │ │ ├── what-a-deployment.yaml │ │ │ │ └── fillers.yaml │ │ │ └── default │ │ │ │ └── fillers.yaml │ │ └── kustomization.yaml │ └── init.yaml ├── certs │ ├── id_rsa.pub │ └── id_rsa ├── up.sh └── Vagrantfile └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | */.vagrant 3 | -------------------------------------------------------------------------------- /cluster1/tmp/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /cluster1/down.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | vagrant destroy --force 3 | rm -rf .vagrant 4 | rm -rf tmp/* 5 | touch tmp/.gitignore 6 | -------------------------------------------------------------------------------- /cluster1/scripts/configure-master1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | cp /vagrant/scripts/resources/kube-scheduler-amazing.yaml /etc/kubernetes/manifests/ 3 | -------------------------------------------------------------------------------- /cluster1/scripts/update-dns.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | sed -i -e 's/#DNS=/DNS=8.8.8.8/' /etc/systemd/resolved.conf 3 | service systemd-resolved restart -------------------------------------------------------------------------------- /cluster1/scripts/install-worker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | kubeadm reset -f 3 | sh /vagrant/tmp/master-join-command.sh 4 | systemctl daemon-reload 5 | service kubelet start 6 | -------------------------------------------------------------------------------- /cluster1/k8s/resources/namespaces.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | name: development 5 | --- 6 | apiVersion: v1 7 | kind: Namespace 8 | metadata: 9 | name: management 10 | -------------------------------------------------------------------------------- /cluster1/k8s/resources/priority.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: scheduling.k8s.io/v1 2 | kind: PriorityClass 3 | metadata: 4 | name: high-priority-important 5 | value: 9999999 6 | preemptionPolicy: Never 7 | globalDefault: false 8 | description: 'I am so important' -------------------------------------------------------------------------------- /cluster1/certs/id_rsa.pub: -------------------------------------------------------------------------------- 1 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/yjist5+jPPne88bKsCDldQIxieZlIbxpTvx+lKdLbXdn0gIMehTLZWvJEeSJwDPZF2YtHPxtb31LD2TK4f5tF0dc2XTF0XjOek8S+vutM7ADO7N6E0wMhnJFBxq6a2NVRAnhEiMJWKpxJlpf0r1P/dHxPWlo493KnshoiYYaAYazf9Vh4EJ7BfDZdOiLwEnDw3riPUAvWyb4/mU8gJhMVOUmxaK+uOBApAFZJqGCcp3qYNcmtPbQa+yXkYWi6v7otTxTXqcU/13+vgpCCt+fqS4W4GlwMpc72eyLs5cfMBwD2rU5Zh34L4cbdmUMizQFKpHeS3iS1gwT32w35kS7 k8s@terminal 2 | -------------------------------------------------------------------------------- /cluster1/k8s/resources/namespaces/management/web-server.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | creationTimestamp: null 5 | labels: 6 | run: web-server 7 | name: web-server 8 | namespace: management 9 | spec: 10 | containers: 11 | - image: nginx:1.16.1-alpine 12 | name: nginx 13 | - image: httpd:2.4.41-alpine 14 | name: httpd 15 | dnsPolicy: ClusterFirst 16 | restartPolicy: Never 17 | status: {} -------------------------------------------------------------------------------- /cluster1/k8s/resources/namespaces/management/important-pod.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | creationTimestamp: null 5 | labels: 6 | run: important-pod 7 | name: important-pod 8 | namespace: management 9 | spec: 10 | containers: 11 | - image: nginx:1.16.1-alpine 12 | name: important 13 | dnsPolicy: ClusterFirst 14 | restartPolicy: Never 15 | priorityClassName: high-priority-important 16 | status: {} -------------------------------------------------------------------------------- /cluster1/k8s/resources/kustomization.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kustomize.config.k8s.io/v1beta1 2 | kind: Kustomization 3 | 4 | resources: 5 | - priority.yaml 6 | - namespaces.yaml 7 | - namespaces/default/fillers.yaml 8 | - namespaces/development/fillers.yaml 9 | - namespaces/development/what-a-deployment.yaml 10 | - namespaces/management/fillers.yaml 11 | - namespaces/management/web-server.yaml 12 | - namespaces/management/important-pod.yaml 13 | -------------------------------------------------------------------------------- /cluster1/scripts/set-hosts.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #set -e 3 | #IFNAME=$1 4 | #ADDRESS="$(ip -4 addr show $IFNAME | grep "inet" | head -1 |awk '{print $2}' | cut -d/ -f1)" 5 | #sed -e "s/^.*${HOSTNAME}.*/${ADDRESS} ${HOSTNAME} ${HOSTNAME}.local/" -i /etc/hosts 6 | # 7 | ## remove ubuntu-bionic entry 8 | #sed -e '/^.*ubuntu-bionic.*/d' -i /etc/hosts 9 | 10 | # Update /etc/hosts about other hosts 11 | cat >> /etc/hosts < /vagrant/tmp/master-join-command.sh 8 | 9 | mkdir -p $HOME/.kube 10 | sudo cp -Rf /etc/kubernetes/admin.conf $HOME/.kube/config 11 | sudo chown $(id -u):$(id -g) $HOME/.kube/config 12 | sudo cp $HOME/.kube/config /vagrant/tmp/kubeconfig_admin 13 | 14 | cp /vagrant/certs/id_rsa /root/.ssh/id_rsa 15 | cp /vagrant/certs/id_rsa.pub /root/.ssh/id_rsa.pub 16 | chmod 400 /root/.ssh/id_rsa 17 | chmod 400 /root/.ssh/id_rsa.pub 18 | 19 | kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" 20 | -------------------------------------------------------------------------------- /cluster1/k8s/resources/namespaces/development/fillers.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: web-dev-shop 5 | namespace: development 6 | spec: 7 | replicas: 1 8 | selector: 9 | matchLabels: 10 | id: web-dev-shop 11 | template: 12 | metadata: 13 | labels: 14 | id: web-dev-shop 15 | spec: 16 | containers: 17 | - image: httpd:2.4-alpine 18 | name: httpd 19 | --- 20 | apiVersion: apps/v1 21 | kind: Deployment 22 | metadata: 23 | name: web-dev-shop-dev2 24 | namespace: development 25 | spec: 26 | replicas: 2 27 | selector: 28 | matchLabels: 29 | id: web-dev-shop-dev2 30 | template: 31 | metadata: 32 | labels: 33 | id: web-dev-shop-dev2 34 | spec: 35 | containers: 36 | - image: httpd:2.4-alpine 37 | name: httpd -------------------------------------------------------------------------------- /cluster1/scripts/install-kube.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Source: http://kubernetes.io/docs/getting-started-guides/kubeadm/ 4 | 5 | apt-get remove -y docker.io kubelet kubeadm kubectl kubernetes-cni 6 | apt-get autoremove -y 7 | systemctl daemon-reload 8 | curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - 9 | cat < /etc/apt/sources.list.d/kubernetes.list 10 | deb http://apt.kubernetes.io/ kubernetes-xenial main 11 | EOF 12 | apt-get update 13 | apt-get install -y docker.io kubelet=1.18.2-00 kubeadm=1.18.2-00 kubectl=1.18.2-00 kubernetes-cni 14 | cat > /etc/docker/daemon.json < "shell", :path => "scripts/set-hosts.sh" do |s| 27 | s.args = ["enp0s8"] 28 | end 29 | 30 | node.vm.provision 'shell', inline: "cat /vagrant/certs/id_rsa.pub >> /root/.ssh/authorized_keys" 31 | node.vm.provision "update-dns", type: "shell", :path => "scripts/update-dns.sh" 32 | node.vm.provision "install-kube", type: "shell", :path => "scripts/install-kube.sh" 33 | node.vm.provision "install-master", type: "shell", :path => "scripts/install-master.sh", env: {"MASTER_IP" => "#{IP_MASTER1}", "POD_NW_CIDR" => "#{POD_NW_CIDR}"} 34 | node.vm.provision "configure-master1", type: "shell", :path => "scripts/configure-master1.sh" 35 | end 36 | 37 | config.vm.define "cluster1-worker1" do |node| 38 | 39 | node.vm.provider "virtualbox" do |vb| 40 | vb.name = "cluster1-worker1" 41 | vb.memory = 2048 42 | vb.cpus = 1 43 | 44 | vb.customize [ 45 | "modifyvm", :id, "--uartmode1", "file", 46 | File.join(Dir.pwd, "tmp/cluster1-worker1.log") 47 | ] 48 | end 49 | 50 | node.vm.hostname = "cluster1-worker1" 51 | node.vm.network :private_network, ip: IP_WORKER1 52 | 53 | node.vm.provision "set-hosts", :type => "shell", :path => "scripts/set-hosts.sh" do |s| 54 | s.args = ["enp0s8"] 55 | end 56 | 57 | node.vm.provision 'shell', inline: "cat /vagrant/certs/id_rsa.pub >> /root/.ssh/authorized_keys" 58 | node.vm.provision "update-dns", type: "shell", :path => "scripts/update-dns.sh" 59 | node.vm.provision "install-kube", type: "shell", :path => "scripts/install-kube.sh" 60 | node.vm.provision "install-worker", type: "shell", :path => "scripts/install-worker.sh", env: {"MASTER_IP" => "#{IP_MASTER1}"} 61 | end 62 | end 63 | -------------------------------------------------------------------------------- /cluster1/k8s/resources/namespaces/management/fillers.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: m-2x3-web 5 | namespace: management 6 | spec: 7 | replicas: 3 8 | selector: 9 | matchLabels: 10 | id: m-2x3-web 11 | template: 12 | metadata: 13 | labels: 14 | id: m-2x3-web 15 | spec: 16 | containers: 17 | - image: httpd:2.4-alpine 18 | name: httpd 19 | --- 20 | apiVersion: v1 21 | kind: Service 22 | metadata: 23 | labels: 24 | id: m-2x3-web-svc 25 | name: m-2x3-web-svc 26 | namespace: management 27 | spec: 28 | ports: 29 | - name: 4545-80 30 | port: 4545 31 | protocol: TCP 32 | targetPort: 80 33 | selector: 34 | id: m-2x3-web 35 | type: ClusterIP 36 | --- 37 | apiVersion: apps/v1 38 | kind: Deployment 39 | metadata: 40 | labels: 41 | id: m-2x3-api 42 | name: m-2x3-api 43 | namespace: management 44 | spec: 45 | replicas: 2 46 | selector: 47 | matchLabels: 48 | id: m-2x3-api 49 | template: 50 | metadata: 51 | labels: 52 | id: m-2x3-api 53 | spec: 54 | containers: 55 | - image: httpd:2.4-alpine 56 | name: api 57 | --- 58 | apiVersion: v1 59 | kind: Service 60 | metadata: 61 | labels: 62 | id: m-2x3-api-svc 63 | name: m-2x3-api-svc 64 | namespace: management 65 | spec: 66 | ports: 67 | - name: 4546-80 68 | port: 4546 69 | protocol: TCP 70 | targetPort: 80 71 | selector: 72 | id: m-2x3-api 73 | type: ClusterIP 74 | --- 75 | apiVersion: apps/v1 76 | kind: Deployment 77 | metadata: 78 | labels: 79 | type: runner 80 | tag: light 81 | name: m-3cc-runner 82 | namespace: management 83 | spec: 84 | replicas: 2 85 | selector: 86 | matchLabels: 87 | id: m-3cc-runner 88 | template: 89 | metadata: 90 | creationTimestamp: null 91 | labels: 92 | id: m-3cc-runner 93 | spec: 94 | containers: 95 | - image: python:3.7.4-alpine3.9 96 | name: python 97 | args: ['sh', '-c', 'sleep 2d'] 98 | --- 99 | apiVersion: apps/v1 100 | kind: Deployment 101 | metadata: 102 | labels: 103 | type: runner 104 | tag: heavy 105 | name: m-3cc-runner-heavy 106 | namespace: management 107 | spec: 108 | replicas: 2 109 | selector: 110 | matchLabels: 111 | id: m-3cc-runner-heavy 112 | template: 113 | metadata: 114 | labels: 115 | id: m-3cc-runner-heavy 116 | spec: 117 | containers: 118 | - image: python:3.7.4-alpine3.9 119 | name: python 120 | args: ['sh', '-c', 'sleep 2d'] 121 | 122 | -------------------------------------------------------------------------------- /cluster1/k8s/init.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | name: development 5 | --- 6 | apiVersion: v1 7 | kind: Namespace 8 | metadata: 9 | name: management 10 | --- 11 | apiVersion: v1 12 | kind: Service 13 | metadata: 14 | labels: 15 | id: m-2x3-api-svc 16 | name: m-2x3-api-svc 17 | namespace: management 18 | spec: 19 | ports: 20 | - name: 4546-80 21 | port: 4546 22 | protocol: TCP 23 | targetPort: 80 24 | selector: 25 | id: m-2x3-api 26 | type: ClusterIP 27 | --- 28 | apiVersion: v1 29 | kind: Service 30 | metadata: 31 | labels: 32 | id: m-2x3-web-svc 33 | name: m-2x3-web-svc 34 | namespace: management 35 | spec: 36 | ports: 37 | - name: 4545-80 38 | port: 4545 39 | protocol: TCP 40 | targetPort: 80 41 | selector: 42 | id: m-2x3-web 43 | type: ClusterIP 44 | --- 45 | apiVersion: scheduling.k8s.io/v1 46 | description: I am so important 47 | globalDefault: false 48 | kind: PriorityClass 49 | metadata: 50 | name: high-priority-important 51 | preemptionPolicy: Never 52 | value: 9999999 53 | --- 54 | apiVersion: apps/v1 55 | kind: Deployment 56 | metadata: 57 | name: web-test 58 | namespace: default 59 | spec: 60 | replicas: 3 61 | selector: 62 | matchLabels: 63 | id: web-test 64 | template: 65 | metadata: 66 | labels: 67 | id: web-test 68 | spec: 69 | containers: 70 | - image: httpd:2.4-alpine 71 | name: httpd 72 | --- 73 | apiVersion: apps/v1 74 | kind: Deployment 75 | metadata: 76 | name: web-test-2 77 | namespace: default 78 | spec: 79 | replicas: 1 80 | selector: 81 | matchLabels: 82 | id: web-test-2 83 | template: 84 | metadata: 85 | labels: 86 | id: web-test-2 87 | spec: 88 | containers: 89 | - image: httpd:2.4-alpine 90 | name: httpd 91 | --- 92 | apiVersion: apps/v1 93 | kind: Deployment 94 | metadata: 95 | name: web-dev-shop 96 | namespace: development 97 | spec: 98 | replicas: 1 99 | selector: 100 | matchLabels: 101 | id: web-dev-shop 102 | template: 103 | metadata: 104 | labels: 105 | id: web-dev-shop 106 | spec: 107 | containers: 108 | - image: httpd:2.4-alpine 109 | name: httpd 110 | --- 111 | apiVersion: apps/v1 112 | kind: Deployment 113 | metadata: 114 | name: web-dev-shop-dev2 115 | namespace: development 116 | spec: 117 | replicas: 2 118 | selector: 119 | matchLabels: 120 | id: web-dev-shop-dev2 121 | template: 122 | metadata: 123 | labels: 124 | id: web-dev-shop-dev2 125 | spec: 126 | containers: 127 | - image: httpd:2.4-alpine 128 | name: httpd 129 | --- 130 | apiVersion: apps/v1 131 | kind: Deployment 132 | metadata: 133 | creationTimestamp: null 134 | labels: 135 | run: what-a-deployment 136 | name: what-a-deployment 137 | namespace: development 138 | spec: 139 | replicas: 2 140 | selector: 141 | matchLabels: 142 | run: what-a-deployment 143 | strategy: {} 144 | template: 145 | metadata: 146 | creationTimestamp: null 147 | labels: 148 | run: what-a-deployment 149 | spec: 150 | containers: 151 | - image: nginx:1.17.6-alpine 152 | name: what-a-deployment 153 | resources: {} 154 | --- 155 | apiVersion: apps/v1 156 | kind: Deployment 157 | metadata: 158 | labels: 159 | id: m-2x3-api 160 | name: m-2x3-api 161 | namespace: management 162 | spec: 163 | replicas: 2 164 | selector: 165 | matchLabels: 166 | id: m-2x3-api 167 | template: 168 | metadata: 169 | labels: 170 | id: m-2x3-api 171 | spec: 172 | containers: 173 | - image: httpd:2.4-alpine 174 | name: api 175 | --- 176 | apiVersion: apps/v1 177 | kind: Deployment 178 | metadata: 179 | name: m-2x3-web 180 | namespace: management 181 | spec: 182 | replicas: 3 183 | selector: 184 | matchLabels: 185 | id: m-2x3-web 186 | template: 187 | metadata: 188 | labels: 189 | id: m-2x3-web 190 | spec: 191 | containers: 192 | - image: httpd:2.4-alpine 193 | name: httpd 194 | --- 195 | apiVersion: apps/v1 196 | kind: Deployment 197 | metadata: 198 | labels: 199 | tag: light 200 | type: runner 201 | name: m-3cc-runner 202 | namespace: management 203 | spec: 204 | replicas: 2 205 | selector: 206 | matchLabels: 207 | id: m-3cc-runner 208 | template: 209 | metadata: 210 | creationTimestamp: null 211 | labels: 212 | id: m-3cc-runner 213 | spec: 214 | containers: 215 | - args: 216 | - sh 217 | - -c 218 | - sleep 2d 219 | image: python:3.7.4-alpine3.9 220 | name: python 221 | --- 222 | apiVersion: apps/v1 223 | kind: Deployment 224 | metadata: 225 | labels: 226 | tag: heavy 227 | type: runner 228 | name: m-3cc-runner-heavy 229 | namespace: management 230 | spec: 231 | replicas: 2 232 | selector: 233 | matchLabels: 234 | id: m-3cc-runner-heavy 235 | template: 236 | metadata: 237 | labels: 238 | id: m-3cc-runner-heavy 239 | spec: 240 | containers: 241 | - args: 242 | - sh 243 | - -c 244 | - sleep 2d 245 | image: python:3.7.4-alpine3.9 246 | name: python 247 | --- 248 | apiVersion: v1 249 | kind: Pod 250 | metadata: 251 | creationTimestamp: null 252 | labels: 253 | run: important-pod 254 | name: important-pod 255 | namespace: management 256 | spec: 257 | containers: 258 | - image: nginx:1.16.1-alpine 259 | name: important 260 | dnsPolicy: ClusterFirst 261 | priorityClassName: high-priority-important 262 | restartPolicy: Never 263 | status: {} 264 | --- 265 | apiVersion: v1 266 | kind: Pod 267 | metadata: 268 | creationTimestamp: null 269 | labels: 270 | run: web-server 271 | name: web-server 272 | namespace: management 273 | spec: 274 | containers: 275 | - image: nginx:1.16.1-alpine 276 | name: nginx 277 | - image: httpd:2.4.41-alpine 278 | name: httpd 279 | dnsPolicy: ClusterFirst 280 | restartPolicy: Never 281 | status: {} 282 | --------------------------------------------------------------------------------