使用Infrastructor构建Kubernetes实验室

在此了解如何使用Infrastructor在虚拟机上创建Kubernetes集群。

介绍
Infrastructor是一个用Groovy编写的开源服务器配置工具。它提供了功能强大的DSL,可简化裸机服务器和虚拟机的配置管理。在本文中,我将向您展示如何在虚拟机之上设置一个小型Kubernetes集群,这对于学习它非常方便。

我们将在3个VM之上构建一个Kubernetes集群,使用Vagrant和VirtualBox创建VM:1个主节点(控制平面),2个工作节点。

可以轻松增加工作节点的数量,具体取决于您的需求和硬件容量。我们还将使用Calico 3.4网络插件。

先决条件:
请确保您的计算机上安装了以下软件:

1. Java 8 - 运行Infrastructor所必需的

2.Infrastructor 0.2.2(可从SDKMAN一起安装

3. Vagrant 2.2.x

4. VirtualBox 5.2.x

配置脚本的源代码下载地址

设置VM
让我们在Vagrantfile中描述VM配置:

Vagrant.configure("2") do |config|
   config.vm.box =
"ubuntu/bionic64"
   config.vm.define
"master" do |node|
      node.vm.network
"private_network", ip: "192.168.65.10"
      node.vm.
provider :virtualbox do |vb|
        vb.memory =
4096
      end
   end
   (
1..2).each do |i|
    config.vm.define
"node-#{i}" do |node|
      ip =
"192.168.65.1#{i}"
      node.vm.network
"private_network", ip: ip
      node.vm.
provider :virtualbox do |vb|
        vb.memory =
2048
      end
    end
   end
end

主节点有4GB的RAM,工作节点各有2GB。如果需要,请随意调整这些设置。使用以下命令启动节点:

vagrant up

在VM启动并运行后,我们可以运行配置脚本来配置Kubernetes集群。

提供Kubernetes集群
以下描述一个带有Infrastructor的Kkubernetes集群的设置过程。我们将在一个文件中定义所有内容:provision.groovy。配置脚本将有5个主要任务:
1.描述清单:定义所有节点和角色。Infrastructor将使用SSH连接到节点。

def keypath(def machine) { ".vagrant/machines/$machine/virtualbox/private_key" }
def inventory = inlineInventory {
    node
id: 'master', host: '192.168.65.10', username: 'vagrant', keyfile: keypath('master'), tags: [role: 'master']
    (
1..2).each {
        node
id: "node-$it", host: "192.168.65.1$it", username: 'vagrant', keyfile: keypath("node-$it")
    }
}

2.初始化主机。将主机名更新为相应的节点ID并关闭交换。

task name: "initializing host", parallel: ON_ALL_NODES, actions: {
    file {
        user    =
'root'
        target   =
"/etc/hostname"
        content = node.id
    }
    insertBlock {
        user     =
'root'
        target   =
'/etc/hosts'
        block    =
"127.0.0.1\t${node.id}\n"
        position = START
    }
    shell
"sudo hostname ${node.id}"
    shell
"sudo swapoff -a"
}

3. 使用apt安装kublet,kubeadm,kubectl和kubernetes-cni软件包,并更新Kubernetes节点IP以指向正确的网络设备(本地网络而不是默认NAT):

task name: "installing kubernetes", parallel: ON_ALL_NODES, actions: { node ->
    shell
user: 'root', command: '''
        apt update
        apt install docker.io -y
        usermod -aG docker vagrant
    '''

    file {
        user =
'root'
        target =
'/etc/apt/sources.list.d/kubernetes.list'
        content =
'deb http://apt.kubernetes.io/ kubernetes-xenial main'
    }
    shell
user: 'root', command: '''
        curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
        apt update
        apt install kubelet kubeadm kubectl kubernetes-cni -y
    '''

    file   
user: 'root', target: '/etc/default/kubelet', content: "KUBELET_EXTRA_ARGS=--node-ip=$node.host"
}

4.使用kubeadm init 初始化Kubernetes主节点 并安装Calico CNI插件 。

task name: "initializing kubernetes master", filter: {'role:master'}, actions: { node ->
    shell
"""
        sudo kubeadm init --token $TOKEN \
        --apiserver-advertise-address $node.host \
        --apiserver-bind-port $API_SERVER_BIND_PORT \
        --pod-network-cidr $POD_NETWORK_CIDR
    """

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

    shell
'''
        kubectl apply -f https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/etcd.yaml
        kubectl apply -f https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/calico.yaml
    '''

}

5.使用kubeadm join将工作节点加入群集   :

task name: "initializing worker nodes", filter: {!'role:master'}, parallel: ON_ALL_NODES, actions: {
    shell
"sudo kubeadm join $MASTER_HOST:$API_SERVER_BIND_PORT --token $TOKEN --discovery-token-unsafe-skip-ca-verification"
}

现在   provision.groovy   包含设置Kubernetes集群的所有步骤:

def keypath(def machine) { ".vagrant/machines/$machine/virtualbox/private_key" }
def inventory = inlineInventory {
    node
id: 'master', host: '192.168.65.10', username: 'vagrant', keyfile: keypath('master'), tags: [role: 'master']
    (
1..2).each {
        node
id: "node-$it", host: "192.168.65.1$it", username: 'vagrant', keyfile: keypath("node-$it")
    }
}
inventory.provision { nodes ->
   
def TOKEN = "change.me00000000000000"
   
def POD_NETWORK_CIDR = "10.50.0.0/16"
   
def API_SERVER_BIND_PORT = 8080
   
def MASTER_HOST = nodes['master'].host
   
def ON_ALL_NODES = nodes.size()
    task
name: "initializing host", parallel: ON_ALL_NODES, actions: {
        file {
            user    =
'root'
            target   =
"/etc/hostname"
            content = node.id
        }
        insertBlock {
            user     =
'root'
            target   =
'/etc/hosts'
            block    =
"127.0.0.1\t${node.id}\n"
            position = START
        }
        shell
"sudo hostname ${node.id}"
        shell
"sudo swapoff -a"
    }
    task
name: "installing kubernetes", parallel: ON_ALL_NODES, actions: { node ->
        shell
user: 'root', command: '''
            apt update
            apt install docker.io -y
            usermod -aG docker vagrant
        '''

        file {
            user =
'root'
            target =
'/etc/apt/sources.list.d/kubernetes.list'
            content =
'deb http://apt.kubernetes.io/ kubernetes-xenial main'
        }
        shell
user: 'root', command: '''
            curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
            apt update
            apt install kubelet kubeadm kubectl kubernetes-cni -y
        '''

        file   
user: 'root', target: '/etc/default/kubelet', content: "KUBELET_EXTRA_ARGS=--node-ip=$node.host"
    }
    task
name: "initializing kubernetes master", filter: {'role:master'}, actions: { node ->
        shell
"""
            sudo kubeadm init --token $TOKEN \
            --apiserver-advertise-address $node.host \
            --apiserver-bind-port $API_SERVER_BIND_PORT \
            --pod-network-cidr $POD_NETWORK_CIDR
        """

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

        shell
'''
            kubectl apply -f https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/etcd.yaml
            kubectl apply -f https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/calico.yaml
        '''

    }
    task
name: "initializing worker nodes", filter: {!'role:master'}, parallel: ON_ALL_NODES, actions: {
        shell
"sudo kubeadm join $MASTER_HOST:$API_SERVER_BIND_PORT --token $TOKEN --discovery-token-unsafe-skip-ca-verification"
    }
}


您可以使用
infrastructor          CLI运行它:

$ infrastructor run -f provision.groovy

输出应如下所示:

$ infrastructor run -f provision.groovy
[INFO] running
file: 'provision.groovy'
[INFO]
task: 'initializing host'
[INFO]
task: 'initializing host', done on 3 node|s
[INFO]
task: 'installing kubernetes'
[INFO]
task: 'installing kubernetes', done on 3 node|s
[INFO]
task: 'initializing kubernetes master'
[INFO]
task: 'initializing kubernetes master', done on 1 node|s
[INFO]
task: 'initializing worker nodes'
[INFO]
task: 'initializing worker nodes', done on 2 node|s
[INFO]
file: 'provision.groovy' is done
EXECUTION COMPLETE
in 2 minutes, 22.393 seconds

然后,您可以ssh到主节点并检查群集的状态:

$ vagrant ssh master
$ kubectl get po --all-namespaces
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-etcd-hs5wb                         
1/1     Running   0          11m
kube-system   calico-kube-controllers-5d94b577bb-djj64   1/
1     Running   0          11m
kube-system   calico-node-fc6gb                         
1/1     Running   0          11m
kube-system   calico-node-rsxgs                          1/
1     Running   0          11m
kube-system   calico-node-wrbfk                         
1/1     Running   0          11m
kube-system   coredns-86c58d9df4-cmt9d                   1/
1     Running   0          11m
kube-system   coredns
-86c58d9df4-wlxjj                   1/1     Running   0          11m
kube-system   etcd-master                                1/
1     Running   0          10m
kube-system   kube-apiserver-master                     
1/1     Running   0          10m
kube-system   kube-controller-manager-master             1/
1     Running   0          10m
kube-system   kube-proxy
-6v2pm                           1/1     Running   0          11m
kube-system   kube-proxy-9t4vh                           1/
1     Running   0          11m
kube-system   kube-proxy-ckh4j                           
1/1     Running   0          11m
kube-system   kube-scheduler-master                      1/
1     Running   0          10m

所有服务都应该可以启动,运行。您的Kubernetes群集已准备好托管服务。您可以使用kubectl命令直接从主节点管理它。您还可以修改Vagrantfile和provision.groovy文件以添加更多工作节点。

阅读 37