Pre –

Today I want to build a K8S cluster environment on my computer and prepare for the subsequent development of the game micro-service framework, but I wasted a lot of time. I regret not using Minikube to build the stand-alone version. I have passed the test of these configuration files recorded below, of course, I don’t know when they will expire

Reference blog: blog link, corrected the original pit, increased the domestic mirror address, convenient domestic installation

The body of the

Install virtualBox

brew install virtualbox
Copy the code

Install the vagrant

brew install vagrant
Copy the code

Use offline box(optional, download box by yourself)

Add the downloaded box to the libraryVagrant box add Bento /ubuntu-16.04 ~/Downloads/ download-bento-UbuntuSwitch to the box library directory
cd~ /. Vagrant. D/boxes/bento - VAGRANTSLASH - ubuntu 16.04# Add meta information
echo -n "https://vagrantcloud.com/bento/ubuntu-16.04" > metadata_url
# change directory name version number0 mv 201910.20.0# Check whether it is normal
vagrant box list
Copy the code

Creating a Configuration File

The new directory

Create project directory
mkdir myproject && cd myproject
Copy the code

Create a new Vagrantfile file and add the following content

IMAGE_NAME = "bento/ubuntu-16.04"
N=2

Vagrant.configure("2") do |config|

    config.ssh.insert_key = false

    config.vm.provider "virtualbox" do |v|
        v.memory = 1024
        v.cpus = 2
    end

    config.vm.define "k8s-master" do |master|
        master.vm.box = IMAGE_NAME
        master.vm.network "private_network", ip: "192.168.50.10"
        master.vm.hostname = "k8s-master"
        master.vm.provision "ansible" do |ansible|
            ansible.playbook = "kubernetes-setup/master-playbook.yml"
            ansible.extra_vars = {
                node_ip: "192.168.50.10", } end end (1.. N).eachdo |i|
        config.vm.define "node-#{i}" do |node|
            node.vm.box = IMAGE_NAME
            node.vm.network "private_network", ip: "192.168.50. # {I + 10}"
            node.vm.hostname = "node-#{i}"
            node.vm.provision "ansible" do |ansible|
                ansible.playbook = "kubernetes-setup/node-playbook.yml"
                ansible.extra_vars = {
                    node_ip: "192.168.50. # {I + 10}",
                }
            end
        end
    end
end
Copy the code

Create an Ansible directory

mkdir kubernetes-setup
Copy the code

Example Create an Ansible configuration file for the master node

kubernetes-setup/master-playbook.yml

---
- hosts: all
  become: true
  tasks:
  - name: Install packages that allow apt to be used over HTTPS
    apt:
      name: "{{ packages }}"
      state: present
      update_cache: yes
    vars:
      packages:
      - apt-transport-https
      - ca-certificates
      - curl
      - gnupg-agent
      - software-properties-common

  - name: Add an apt signing key for Docker
    apt_key:
      url: https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg
      state: present

  - name: Add apt repository for stable version
    apt_repository:
      repo: deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial stable
      state: present

  - name: Install docker and its dependecies
    apt:
      name: "{{ packages }}"
      state: present
      update_cache: yes
    vars:
      packages:
      - docker-ce
      - docker-ce-cli
      - containerd.io
    notify:
      - docker status

  - name: Add vagrant user to docker group
    user:
      name: vagrant
      group: docker

  - name: Remove swapfile from /etc/fstab
    mount:
      name: "{{ item }}"
      fstype: swap
      state: absent
    with_items:
      - swap
      - none

  - name: Disable swap
    command: swapoff -a
    when: ansible_swaptotal_mb > 0
  - name: Add an apt signing key for Kubernetes
    apt_key:
      url: https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
      state: present

  - name: Adding apt repository for Kubernetes
    apt_repository:
      repo: deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
      state: present
      filename: kubernetes.list

  - name: Install Kubernetes binaries
    apt:
      name: "{{ packages }}"
      state: present
      update_cache: yes
    vars:
      packages:
        - kubelet
        - kubeadm
        - kubectl
  - name: Change system to cgroupfs
    command: echo -n "Environment=\"KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs\"" >> /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

  - name: Restart kubelet
    service:
      name: kubelet
      daemon_reload: yes
      state: restarted
  - name: Initialize the Kubernetes cluster using kubeadm
    command: kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers - apiserver - advertise - address = "192.168.50.10" - apiserver - cert - extra - sans = "192.168.50.10"  --node-name k8s-master - pod - network - cidr = 192.168.0.0/16
  - name: Setup kubeconfig for vagrant user
    command: "{{ item }}"
    with_items:
     - mkdir -p /home/vagrant/.kube
     - cp -i /etc/kubernetes/admin.conf /home/vagrant/.kube/config
     - chown vagrant:vagrant /home/vagrant/.kube/config
  - name: Install calico pod network
    become: false
    command: kubectl apply -f https://docs.projectcalico.org/v3.10/getting-started/kubernetes/installation/hosted/calico.yaml
  - name: Generate join command
    command: kubeadm token create --print-join-command
    register: join_command

  - name: Copy join command to local file
    become: false
    local_action: copy content="{{ join_command.stdout_lines[0] }}" dest="./join-command"

  handlers:
    - name: docker status
      service: name=docker state=started
Copy the code

Create ansible configuration files for the node

kubernetes-setup/node-playbook.yml

---
- hosts: all
  become: true
  tasks:
  - name: Install packages that allow apt to be used over HTTPS
    apt:
      name: "{{ packages }}"
      state: present
      update_cache: yes
    vars:
      packages:
      - apt-transport-https
      - ca-certificates
      - curl
      - gnupg-agent
      - software-properties-common

  - name: Add an apt signing key for Docker
    apt_key:
      url: https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg
      state: present

  - name: Add apt repository for stable version
    apt_repository:
      repo: deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial stable
      state: present

  - name: Install docker and its dependecies
    apt:
      name: "{{ packages }}"
      state: present
      update_cache: yes
    vars:
      packages:
      - docker-ce
      - docker-ce-cli
      - containerd.io
    notify:
      - docker status

  - name: Add vagrant user to docker group
    user:
      name: vagrant
      group: docker
  - name: Remove swapfile from /etc/fstab
    mount:
      name: "{{ item }}"
      fstype: swap
      state: absent
    with_items:
      - swap
      - none

  - name: Disable swap
    command: swapoff -a
    when: ansible_swaptotal_mb > 0
  - name: Add an apt signing key for Kubernetes
    apt_key:
      url: https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
      state: present

  - name: Adding apt repository for Kubernetes
    apt_repository:
      repo: deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
      state: present
      filename: kubernetes.list

  - name: Install Kubernetes binaries
    apt:
      name: "{{ packages }}"
      state: present
      update_cache: yes
    vars:
      packages:
        - kubelet
        - kubeadm
        - kubectl

  - name: Change system to cgroupfs
    become: false
    command: echo -n "Environment=\"KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs\"" >> /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

  - name: Restart kubelet
    service:
      name: kubelet
      daemon_reload: yes
      state: restarted

  - name: Copy the join command to server location
    copy: src=join-command dest=/tmp/join-command.sh mode=0777

  - name: Join the node to cluster
    command: sh /tmp/join-command.sh

  handlers:
    - name: docker status
      service: name=docker state=started
Copy the code

Switch to the master node and check whether the deployment is successful

vagrant ssh k8s-master
kubectl get nodes
Copy the code