Elastic:在 Kubernetes 多节点集群部署 Elastic Stack

本文详细介绍了如何在Ubuntu环境中搭建Kubernetes集群,并在其上部署ElasticStack,包括Kubernetes集群的创建、Elasticsearch与Kibana的安装配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在今天的文章中,我们将详细介绍如何创建自己的 Kubernetes 集群,并部署 Elastic Stack。由于篇幅的原因,本篇文章分为两个部分:

  • Kubernetes 集群的创建
  • Elastic Stack 在 Kubernetes 集群里的安装

 

创建 Kubernetes 集群

创建 master 及 node VM

首先我们在我们的 vms 里创建两个目录:kmaster 及 knode:

$ pwd
/Users/liuxg/vms
liuxg:vms liuxg$ ls
kmaster      knode    ubuntu-18.04

在 kmaster 及 knode 子目录中,我们分别创建如下内容的 Vagrantfile 文件。

kmaster: Vagrantfile 文件

# -*- mode: ruby -*-
# vi: set ft=ruby :
VM_BOX  = 'ubuntu/bionic64'
NETWORK = 'forwarded_port'
Vagrant.configure(2) do |config|
  config.vm.box = VM_BOX
  config.vm.hostname = "kmaster"
  config.vm.network :private_network, ip: "10.2.14.78"  
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
    vb.cpus = 2
    vb.memory = 4096
  end
  config.vm.provision 'shell', inline: <<-SHELL
    echo 'ubuntu:ubuntu' | sudo chpasswd
  SHELL
end

knode:Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :
VM_BOX  = 'ubuntu/bionic64'
NETWORK = 'forwarded_port'
Vagrant.configure(2) do |config|
  config.vm.box = VM_BOX
  config.vm.hostname = "knode"
  config.vm.network :private_network, ip: "10.2.14.79"    
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
    vb.cpus = 1
    vb.memory = 4096
  end
  config.vm.provision 'shell', inline: <<-SHELL
    echo 'ubuntu:ubuntu' | sudo chpasswd
  SHELL
end

在这里,我们把 knode 里的 CPU 个数比 kmaster 少一个。这样我们给予 kmaster 更多的资源。

我们分别在 kmaster 及 knode 目录下打入如下的命令:

vagrant up

这样我们的两个 Ubuntu 18.04 的 VM 就启动起来了。我们接着分别登陆这两个 VM。在 kmaster 及 knode 的目录下,打入如下的指令:

vagrant ssh

这样我们就分别就进入了两个 VM。

我们接着打入如下的两个命令来更新我们的 Ubuntu 系统到最新的发布:

sudo apt update
suod apt upgrade

这样我们的 Ubuntu 系统更新到最新的状态。

我们可以同时也查看我们不同机器的 IP 地址:

为每个 VM 设置自己的 hostname

在我们上面的 Vagrant 文件里,我们已经配置了不同的 hostname。但是对于单独安装的机器来说,我们需要使用如下的命令来配置不同的 hostname。

我们可以通过如下的命令来配置 kmaster 及 knode 的 hostname:

sudo hostnamectl set-hostname kmaster
sudo hostnamectl set-hostname knode

等我们设置完毕后,我们并不能马上看见效果。我们需要重新登录才可以。我们打入命令 exit,并重新使用:

vagrant ssh

来进行登录:

我们需要分别对 kmaster 及 knode 的 /etc/hosts 文件进行修改。添加如下的两行:

10.2.14.78      kmaster
10.2.14.79      knode

 

禁止 swap 内存

依据Kubernetes的要求,我们需要禁止 swap 内存。我们在 kmaster 及 knode 里打入如下的命令:

sudo swapoff -a

为了防止下次启动时我们还需要手动地来运行上面的指令。我们需要修改 /etc/fstab。把有 swap 的哪一行注释掉。针对我们的 VM,我们的没有这行。在实际的机器部署中,我们必须这么做。

安装 docker

如下的命令分别在 kmaster 及 knode 上执行。

我们先按照相应的工具:

sudo apt-get update && sudo apt-get install -y apt-transport-https curl

添加密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

安装docker:

sudo apt-get install docker.io -y

我们可以查看一下 docker 的版本:

$ sudo docker version
Client:
 Version:           19.03.6
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        369ce74a3c
 Built:             Fri Feb 28 23:45:43 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          19.03.6
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       369ce74a3c
  Built:            Wed Feb 19 01:06:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.3.3-0ubuntu1~18.04.2
  GitCommit:        
 runc:
  Version:          spec: 1.0.1-dev
  GitCommit:        
 docker-init:
  Version:          0.18.0
  GitCommit:        

由于网络的原因,从 Docker hub 上下载 image 时会会比较慢。我们可以选择从阿里云服务器上进行下载。我们在 /etc/docker 目录下添加文件 daemon.json:

sudo vi /etc/docker/daemon.json

这个文件的内容为:

{
    "registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"],
    "live-restore": true
}

经过这样的改动后,我们重新启动 docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

我们可以通过如下命令来查看 docker 的运行情况:

systemctl status docker
vagrant@kmaster:~$ sudo systemctl daemon-reload
vagrant@kmaster:~$ sudo systemctl restart docker
vagrant@kmaster:~$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: 
   Active: active (running) since Sat 2020-04-25 01:31:28 UTC; 1min 41s ago
     Docs: https://docs.docker.com
 Main PID: 2282 (dockerd)
    Tasks: 9
   CGroup: /system.slice/docker.service
           └─2282 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/contain
lines 1-8/8 (END)

记得我们需要在 knode 上执行同样的命令。

安装 kubectl, kubelet 及 kubadm

安装官方的文档,我们需要安装如下的指令来进行添加密钥:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

但是经过测试,上面的地址是访问不到的:

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
gpg: no valid OpenPGP data found.

我们通过一些方法在浏览器地址中输入地址 https://packages.cloud.google.com/apt/doc/apt-key.gpg,并把下载后的文件 apt-key.gpg 保存于 kmaster 和 knode 目录中。我们再按照如下的方式进行安装:

sudo apt-key add apt-key.gpg

我们接下来为 K8s 添加软件源。我们分别在 kmaster 及 knode 的 terminal 中打入如下的命令:

sudo vi /etc/apt/sources.list.d/kubernetes.list

并把如下的内容输入进去:

deb http://apt.kubernetes.io/ kubernetes-xenial main

目前 Ubuntu 只针对 xenial 也就是 16.04 LTS 发布 kubernetes 的安装源。经过试验,在没有条件的情况下,上面的源是不通的。我们需要把上面的这句修改为国内本地的源:

# deb http://apt.kubernetes.io/ kubernetes-xenial main
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main

经过这样的改造后,我们使用如下的命令来更新系统:

sudo apt update

一旦我们的系统更新完毕,我们再按照如下的方法来进行安装:

sudo apt install kubeadm=1.14.0-00 -y

由于一些原因,我们并不能得到最新的 kubernetes 的版本。在 Ubuntu 系统中,我们可以通过如下的命令来查看所有已经有的版本信息:

apt-cache policy kubeadm

在上面,我们来安装特定版本的 kubernetes 1.14。等安装完毕后,我们检查 kubeadm 的版本:

kubeadm version
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:51:21Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}

为了和 kubeadm 配套,我们也同时通过如下的命令来安装 kubectl 的版本到 1.14.0:

sudo apt install kubectl=1.14.0-00
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:53:57Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}

这样,我们的两个版本目前是一直的。

同样地,我们也把 kubelet 的版本配置到 1.14.0-00:

sudo apt-get install kubelet=1.14.0-00
$ sudo kubelet --version
Kubernetes v1.14.0

更改 Kubernetes 的配置。我们使用编辑器打开如下的文件:

sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

我们添加如下的一行:

Environment=”cgroup-driver=systemd/cgroup-driver=cgroupfs”

记得分别对 kmaster 和 knode 做这个配置。

 

安装 OpenSSH-Sever 

针对我们的VM,我们不需要安装这个。但是对于有些裸机,我们需要输入如下的命令来进行安装:

sudo apt-get install openssh-server 

下载 kubernetes 安装文件

由于一些原因 Kubernetes 的安装文件,我们并不可以得到。我们需要使用特别的方法来进行下载并进行处理。在 kmaster 及 knode terminal 中分别打入如下的命令:

sudo docker pull mirrorgooglecontainers/kube-apiserver:v1.14.0
sudo docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.0
sudo docker pull mirrorgooglecontainers/kube-scheduler:v1.14.0
sudo docker pull mirrorgooglecontainers/kube-proxy:v1.14.0
sudo docker pull mirrorgooglecontainers/pause:3.1
sudo docker pull mirrorgooglecontainers/etcd:3.3.10
sudo docker pull coredns/coredns:1.3.1

等所有的文件下载完毕后,我们可以通过如下的命令来进行查看:

sudo docker images

我们再接着打入如下的命令:

sudo docker tag docker.io/mirrorgooglecontainers/kube-apiserver:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0
sudo docker tag docker.io/mirrorgooglecontainers/kube-controller-manager:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0
sudo docker tag docker.io/mirrorgooglecontainers/kube-scheduler:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0
sudo docker tag docker.io/mirrorgooglecontainers/kube-proxy:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0
sudo docker tag docker.io/mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
sudo docker tag docker.io/mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
sudo docker tag docker.io/coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

通过上面的命令,我们确保在 kubernetes 安装时不必下载安装文件。

只对 Kubernetes Master VM (kmaster)

到目前为止,我们所有的安装都是针对 kmaster 和 knode 同时进行的。在这一节中,我必须隆重指出:这一节里的所有的操作只针对 kmaster。

我们在 kmaster 的 terminal 中输入如下的命令:

sudo kubeadm init --apiserver-advertise-address=10.2.14.78 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap

请注意上面的 10.2.14.78 是 kmaster 的IP地址。你可以通过 ifconfig 命令获得。

等上面的命令完成后,我们可以看到如下的信息:

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

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/

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

kubeadm join 10.2.14.78:6443 --token q3866m.3k69hiwkuqbyqtw1 \
    --discovery-token-ca-cert-hash sha256:16d2474f18691322c172e9d211353ea25b4c4aa3b5b51c2acc8bde4de2643ece 

我们必须注意上面的红色框的部分。我们需要按照上面的指令来完成:

如果你忘记了那个 kueadm join 的指令,那么你可以通过如下的命令来获得:

sudo kubeadm token create --print-join-command

为了验证我们的 kubectl 是否已经工作,我们运行如下的命令:

kubectl get pods -o wide --all-namespaces

从上面,我们可以看出来除了两个两个 dns 的 pod 没有被运行起来,其它的都已经被成功运行起来了。为了解决这个问题,我们安装如下的方法来进行安装:

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.apps/weave-net created

运行完上面的指令后,我们重新查看状态:

kubectl get pods -o wide --all-namespaces

现在所有的 pop 都运行正常。状态显示为 Running。是不是有点小激动啊?

我们可以通过如下的命令来查看 node:

kubectl get nodes
$ kubectl get nodes
NAME      STATUS   ROLES    AGE   VERSION
kmaster   Ready    master   15m   v1.14.0

只对 Kubernetes Node VM (knode)

现在是时候让我们的的 node 加入集群了! 在该节点上安装 kubernetes 之后,这可能是您将在该节点上执行的唯一步骤。

在主服务器上运行 “kubeadm init” 命令时,运行保存的 join 命令。

sudo kubeadm join 10.2.14.78:6443 --token w32f75.v2miinuf7o7afwdq \
    --discovery-token-ca-cert-hash sha256:a851d4eb753807f785bc9118fd7af3cb6f1eb7ef43582bc0b04da2172735d925 

按照上面的提示,我们在 kmaster 上运行命令:

vagrant@kmaster:~$ sudo kubectl get nodes
NAME      STATUS   ROLES    AGE    VERSION
kmaster   Ready    master   128m   v1.14.0
knode     Ready    <none>   2m5s   v1.14.0
$ kubectl get componentstatus
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   
$ kubectl  cluster-info
Kubernetes master is running at https://10.2.14.78:6443
KubeDNS is running at https://10.2.14.78:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

启动 Dashboard

我们首先来安装 Dashboard:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

我发现我这里会出现一个错误。一种办法就是直接到地址https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml 去下载这个,并把下载的文件拷贝到 kmaster 的目录中。然后,我们再按照如下的命令来进行安装:

kubectl apply -f /vagrant/recommended.yaml

经过这样的安装后,我们可以重新查看我们的 pods:

kubectl get pods -o wide --all-namespaces
$ kubectl get pods -o wide --all-namespaces
NAMESPACE              NAME                                         READY   STATUS    RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
default                quickstart-es-default-0                      0/1     Pending   0          154m    <none>       <none>    <none>           <none>
elastic-system         elastic-operator-0                           1/1     Running   1          3h2m    10.44.0.1    knode     <none>           <none>
kube-system            coredns-fb8b8dccf-dvjgd                      1/1     Running   1          3h55m   10.32.0.3    kmaster   <none>           <none>
kube-system            coredns-fb8b8dccf-gnvpr                      1/1     Running   1          3h55m   10.32.0.2    kmaster   <none>           <none>
kube-system            etcd-kmaster                                 1/1     Running   1          3h54m   10.2.14.78   kmaster   <none>           <none>
kube-system            kube-apiserver-kmaster                       1/1     Running   1          3h54m   10.2.14.78   kmaster   <none>           <none>
kube-system            kube-controller-manager-kmaster              1/1     Running   1          3h54m   10.2.14.78   kmaster   <none>           <none>
kube-system            kube-proxy-49lk4                             1/1     Running   1          3h55m   10.2.14.78   kmaster   <none>           <none>
kube-system            kube-proxy-k2ncv                             1/1     Running   1          3h8m    10.2.14.79   knode     <none>           <none>
kube-system            kube-scheduler-kmaster                       1/1     Running   1          3h54m   10.2.14.78   kmaster   <none>           <none>
kube-system            weave-net-bhj7n                              2/2     Running   3          3h43m   10.2.14.78   kmaster   <none>           <none>
kube-system            weave-net-ll96h                              2/2     Running   3          3h8m    10.2.14.79   knode     <none>           <none>
kubernetes-dashboard   dashboard-metrics-scraper-5c6ff85ddd-8f8ls   1/1     Running   1          3h23m   10.32.0.5    kmaster   <none>           <none>
kubernetes-dashboard   kubernetes-dashboard-6cb844f4cd-mf6p4        1/1     Running   1          3h23m   10.32.0.4    kmaster   <none>           <none>

在上面,我们可以看到有一个叫做 kubernetes-dashboard 的 namespace。我可以通过如下的命令来查询:

$ kubectl get ns
NAME                   STATUS   AGE
default                Active   3h58m
elastic-system         Active   3h5m
kube-node-lease        Active   3h58m
kube-public            Active   3h58m
kube-system            Active   3h58m
kubernetes-dashboard   Active   3h26m

上面显示所有的 namespace。更进一步我们通过如下的方法来查看在这个 namespace 上所有的东西:

kubectl -n kubernetes-dashboard get all
$  kubectl -n kubernetes-dashboard get all
NAME                                             READY   STATUS    RESTARTS   AGE
pod/dashboard-metrics-scraper-5c6ff85ddd-8f8ls   1/1     Running   1          3h28m
pod/kubernetes-dashboard-6cb844f4cd-mf6p4        1/1     Running   1          3h28m

NAME                                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
service/dashboard-metrics-scraper   ClusterIP   10.107.44.25   <none>        8000/TCP        3h28m
service/kubernetes-dashboard        NodePort    10.111.59.32   <none>        443:32323/TCP   3h28m

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/dashboard-metrics-scraper   1/1     1            1           3h28m
deployment.apps/kubernetes-dashboard        1/1     1            1           3h28m

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/dashboard-metrics-scraper-5c6ff85ddd   1         1         1       3h28m
replicaset.apps/kubernetes-dashboard-6cb844f4cd        1         1         1       3h28m

上面显示有一个叫做 kubernetes-dashboard-6cb844f4cd-mf6p4 的服务。我们可以通过如下的命令来得到:

kubectl -n kubernetes-dashboard get svc
$ kubectl -n kubernetes-dashboard get svc
NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.107.44.25   <none>        8000/TCP        3h30m
kubernetes-dashboard        ClusterIP    10.111.59.32   <none>        443:32323/TCP   3h30m

上面的 kubernetes-dashboard 是一个 ClusterIP 的服务。可以通过修改把它变为一个 NodePort 的服务。我们打入如下的命令:

kubectl -n kubernetes-dashboard edit svc kubernetes-dashboard

然后对它进行修改:

经过这样的修改过后,我们重新查看:

$ kubectl -n kubernetes-dashboard get svc
NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.107.44.25   <none>        8000/TCP        3h36m
kubernetes-dashboard        NodePort    10.111.59.32   <none>        443:32323/TCP   3h36m

这样我们的 kubernetes-dashboard 变成一个 NodePort 的服务了。

在我们的主机(host)上,我们对 /etc/hosts 进行修改。添加如下的两行:

10.2.14.78      kmaster
10.2.14.79      knode

注意这里的两个 IP 地址分别是我们的 kmaster 及 knode 的 IP 地址。我们打开 Chrome 浏览器,并输入https://kmaster:32323:

我们可以看到:

当我们第一次打开上面的页面时,由于是一个 https 的页面。我们需要在键盘上输入 thisisunsafe 这个字符串。这样,我们就可以看到上面的这个页面。上面的页面需要一个t oken 才可以登录。我们使用如下的命令来得到 service account:

$ kubectl -n kubernetes-dashboard get sa
NAME                   SECRETS   AGE
default                1         3h47m
kubernetes-dashboard   1         3h47m

我们进而看到这个 account 的描述:

$ kubectl -n kubernetes-dashboard describe sa kubernetes-dashboard
Name:                kubernetes-dashboard
Namespace:           kubernetes-dashboard
Labels:              k8s-app=kubernetes-dashboard
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   kubernetes-dashboard-token-bqtxs
Tokens:              kubernetes-dashboard-token-bqtxs
Events:              <none>

在上面,我们可以看到一个 Tokens 项。我们通过如下的命令来查看 token 的内容:

kubectl -n kubernetes-dashboard describe secret kubernetes-dashboard-token-bqtxs

显示的结果:

我们拷贝上面的 token 在上面的浏览器的界面中进行登录。

这样我们就登录进来了。正如上面所看到的那样,没有任何可以显示的东西。我们点击右上角的铃铛,上面有19个警告信息:

我们需要创建一个 service account 来完成。点击右上角的“人”图像。我们先退出来。

接下来,我们来生成一个 dashboard-admin 的 ServiceAccount。

方法一:

在我们的 kmaster 目录下,我们创建如下这个文件:

sa_cluster_admin.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: cluster-admin-rolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kube-system

在这个文件中,我们创建一个 SericeAccount,并分配一个 ClusterRole。我们进入到 /vagrant 目录,并安装:

$ kubectl create -f sa_cluster_admin.yaml 
serviceaccount/dashboard-admin created
clusterrolebinding.rbac.authorization.k8s.io/cluster-admin-rolebinding created

我们再次查看所有的 service account:

kubectl -n kube-system get sa
$ kubectl -n kube-system get sa
NAME                                 SECRETS   AGE
attachdetach-controller              1         4h36m
bootstrap-signer                     1         4h36m
certificate-controller               1         4h36m
clusterrole-aggregation-controller   1         4h36m
coredns                              1         4h36m
cronjob-controller                   1         4h36m
daemon-set-controller                1         4h36m
dashboard-admin                      1         90s
default                              1         4h36m
deployment-controller                1         4h36m
disruption-controller                1         4h36m
endpoint-controller                  1         4h36m
expand-controller                    1         4h36m
generic-garbage-collector            1         4h36m
horizontal-pod-autoscaler            1         4h36m
job-controller                       1         4h36m
kube-proxy                           1         4h36m
namespace-controller                 1         4h36m
node-controller                      1         4h36m
persistent-volume-binder             1         4h36m
pod-garbage-collector                1         4h36m
pv-protection-controller             1         4h36m
pvc-protection-controller            1         4h36m
replicaset-controller                1         4h36m
replication-controller               1         4h36m
resourcequota-controller             1         4h36m
service-account-controller           1         4h36m
service-controller                   1         4h36m
statefulset-controller               1         4h36m
token-cleaner                        1         4h36m
ttl-controller                       1         4h36m
weave-net                            1         4h25m

对于我们感兴趣的是那个 dashboard-admin。我们再次打入如下的命令:

$ kubectl -n kube-system describe sa dashboard-admin
Name:                dashboard-admin
Namespace:           kube-system
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   dashboard-admin-token-wkzsk
Tokens:              dashboard-admin-token-wkzsk
Events:              <none>
kubectl -n kube-system describe secret dashboard-admin-token-wkzsk

上面的命令显示:

我们把上面的 token 拷贝下来,并用于我们的登录界面:

Hooray!  这次我们看到了集群的信息了。

 

方法二

这个方法相比较之前的方法更为简单。我们执行下面的三个指令:

kubectl create serviceaccount dashboard -n default

kubectl create clusterrolebinding dashboard-admin -n default --clusterrole=cluster-admin --serviceaccount=default:dashboard

kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode

在最后的一个指令执行完后,我们就会看到一个 secret。这个 secret 可以用来登录 dashboard。

 

安装 Elastic Stack

我们在 kmaster 里打入如下的命令:

kubectl apply -f https://download.elastic.co/downloads/eck/1.0.1/all-in-one.yaml
$ kubectl apply -f https://download.elastic.co/downloads/eck/1.0.1/all-in-one.yaml
customresourcedefinition.apiextensions.k8s.io/apmservers.apm.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticsearches.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/kibanas.kibana.k8s.elastic.co created
clusterrole.rbac.authorization.k8s.io/elastic-operator created
clusterrolebinding.rbac.authorization.k8s.io/elastic-operator created
namespace/elastic-system created
statefulset.apps/elastic-operator created
serviceaccount/elastic-operator created
validatingwebhookconfiguration.admissionregistration.k8s.io/elastic-webhook.k8s.elastic.co created
service/elastic-webhook-server created
secret/elastic-webhook-server-cert created

我们使用如下的命令来进行监视 operator log:

kubectl -n elastic-system logs -f statefulset.apps/elastic-operator
$ kubectl get pods -o wide --all-namespaces
NAMESPACE        NAME                              READY   STATUS              RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
elastic-system   elastic-operator-0                0/1     ContainerCreating   0          102s    <none>       knode     <none>           <none>
kube-system      coredns-fb8b8dccf-htf6s           1/1     Running             1          133m    10.32.0.2    kmaster   <none>           <none>
kube-system      coredns-fb8b8dccf-jwh45           1/1     Running             1          133m    10.32.0.3    kmaster   <none>           <none>
kube-system      etcd-kmaster                      1/1     Running             1          132m    10.2.14.78   kmaster   <none>           <none>
kube-system      kube-apiserver-kmaster            1/1     Running             1          132m    10.2.14.78   kmaster   <none>           <none>
kube-system      kube-controller-manager-kmaster   1/1     Running             1          132m    10.2.14.78   kmaster   <none>           <none>
kube-system      kube-proxy-2n7r7                  1/1     Running             0          7m39s   10.2.14.79   knode     <none>           <none>
kube-system      kube-proxy-nvvjl                  1/1     Running             1          133m    10.2.14.78   kmaster   <none>           <none>
kube-system      kube-scheduler-kmaster            1/1     Running             1          132m    10.2.14.78   kmaster   <none>           <none>
kube-system      weave-net-4wlnj                   2/2     Running             3          121m    10.2.14.78   kmaster   <none>           <none>
kube-system      weave-net-j7xnk                   2/2     Running             0          7m39s   10.2.14.79   knode     <none>           <none>

上面显示 elastic-sysrtem namespace 下的 elastic-operator-0 正在创建 container。我们稍等一会,再运行:

$ kubectl get pods -o wide --all-namespaces
NAMESPACE        NAME                              READY   STATUS    RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
elastic-system   elastic-operator-0                1/1     Running   0          3m34s   10.44.0.1    knode     <none>           <none>
kube-system      coredns-fb8b8dccf-htf6s           1/1     Running   1          135m    10.32.0.2    kmaster   <none>           <none>
kube-system      coredns-fb8b8dccf-jwh45           1/1     Running   1          135m    10.32.0.3    kmaster   <none>           <none>
kube-system      etcd-kmaster                      1/1     Running   1          134m    10.2.14.78   kmaster   <none>           <none>
kube-system      kube-apiserver-kmaster            1/1     Running   1          134m    10.2.14.78   kmaster   <none>           <none>
kube-system      kube-controller-manager-kmaster   1/1     Running   1          134m    10.2.14.78   kmaster   <none>           <none>
kube-system      kube-proxy-2n7r7                  1/1     Running   0          9m31s   10.2.14.79   knode     <none>           <none>
kube-system      kube-proxy-nvvjl                  1/1     Running   1          135m    10.2.14.78   kmaster   <none>           <none>
kube-system      kube-scheduler-kmaster            1/1     Running   1          134m    10.2.14.78   kmaster   <none>           <none>
kube-system      weave-net-4wlnj                   2/2     Running   3          123m    10.2.14.78   kmaster   <none>           <none>
kube-system      weave-net-j7xnk                   2/2     Running   0          9m31s   10.2.14.79   knode     <none>           <none>

显然我们的 operator 已经被创建好了。

我们接着下来创建一个 Elasticsearch 的集群。我们先创建一个 Elasticsearch:

在命令行中打入如下的命令:

cat <<EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 7.6.2
  nodeSets:
  - name: default
    count: 1
    config:
      node.master: true
      node.data: true
      node.ingest: true
      node.store.allow_mmap: false
EOF
$ cat <<EOF | kubectl apply -f -
> apiVersion: elasticsearch.k8s.elastic.co/v1
> kind: Elasticsearch
> metadata:
>   name: quickstart
> spec:
>   version: 7.6.2
>   nodeSets:
>   - name: default
>     count: 1
>     config:
>       node.master: true
>       node.data: true
>       node.ingest: true
>       node.store.allow_mmap: false
> EOF
elasticsearch.elasticsearch.k8s.elastic.co/quickstart created

当我们再次查看我们的 pod:

$ kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
quickstart-es-default-0   0/1     Pending   0          131m

我们发现我们创建的 pod 处于 Pending 的状态。我们使用如下的命令来查看到底是什么状况:

$ kubectl describe pod quickstart-es-default-0

 

上面表明我们没有 PV 及 PVC。为此,我们需要创建它们。

在我们的 kmaster 目录下,我们创建一个叫做 pvc.yml 的文件。它的内容如下:

 pvc.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: data-pv0
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  claimRef:
    namespace: default
    name: elasticsearch-data-quickstart-es-default-0
  hostPath:
    path: "/mnt/data"

我们重新安装这个:

$ kubectl apply -f pvc.yml 
persistentvolume/data-pv0 configured

我们可以通过如下的命令来查看 PV 及 PVC:

$ kubectl get pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                                STORAGECLASS   REASON   AGE
data-pv0   2Gi        RWO            Recycle          Available   default/elasticsea
$ kubectl get pvc
NAME                                         STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
elasticsearch-data-quickstart-es-default-0   Bound    data-pv0   2Gi        RWO     

我们接着再次查看 pod 的状况:

$ kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
quickstart-es-default-0   1/1     Running   0          34m

这次,显然我们的 pod quickstart-es-default-0 已经运行正常。

我们可以通过如下的命令来查看这个 pod 的日志:

kubectl logs -f quickstart-es-default-0

请求 Elasticsearch 访问

上面的安装自动为我们创建了一个 ClusterIP 的服务:

$ kubectl get service quickstart-es-http
NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
quickstart-es-http   ClusterIP   10.111.1.15   <none>        9200/TCP   17h

我们首先得到默认用户 elastic 的密码:

$ PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode)
vagrant@kmaster:~$ echo $PASSWORD
k9grnwhtsqp2nnhxc7r9zphn

我们接着向 Elasticsearch 的终点来发送请求:

$ curl -u "elastic:$PASSWORD" -k "https://10.111.1.15:9200"
{
  "name" : "quickstart-es-default-0",
  "cluster_name" : "quickstart",
  "cluster_uuid" : "v3LHdrFuS32xv5vNERHssQ",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

上面标明我们的 Elasticsearch 是运行正常的。

我们来查看一下在 default namespace 下运行的所有的服务:

$ kubectl -n default get svc
NAME                    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes              ClusterIP   10.96.0.1     <none>        443/TCP          18h
quickstart-es-default   ClusterIP   None          <none>        <none>           17h
quickstart-es-http      ClusterIP    10.111.1.15   <none>        9200:31308/TCP   17h

上面显示 quickstart-es-http 是一个 ClusterIP 的服务。我们想把它改为 NodePort 的服务:

kubectl edit svc quickstart-es-http

修改完后,我们保存。然后再次使用如下的命令来进行查看:

$ kubectl -n default get svc
NAME                    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes              ClusterIP   10.96.0.1     <none>        443/TCP          18h
quickstart-es-default   ClusterIP   None          <none>        <none>           17h
quickstart-es-http      NodePort    10.111.1.15   <none>        9200:31308/TCP   17h

上面显示我们的 quickstart-es-http 服务以及成功地被修改为 NodePort 的服务了。

打开主机上的浏览器,我们输入地址https://kmaster:31308:

这是由于这个页面时 https 造成的。我们打入 thisisunsafe 字符串:

我们输入之前得到的密码:

上面显示我们的 Elasticsearch 可以被成功地被 host 机器所访问。

我们接下来按照上面同样的方法,已经 Quickstart 所给的提示来进行安装 Kibana。限于篇幅的限制,我在这里就不一一描述了。最后我们可以看到如下的画面:

cat <<EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 7.6.2
  count: 1
  elasticsearchRef:
    name: quickstart
EOF
$ kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
quickstart-es-default-0          1/1     Running   0          86m
quickstart-kb-6f487c444d-7kzwb   1/1     Running   0          7m26s
$ kubectl  get elasticsearch
NAME         HEALTH   NODES   VERSION   PHASE   AGE
quickstart   green    1       7.6.2     Ready   17h
vagrant@kmaster:~$ kubectl  get kibana
NAME         HEALTH   NODES   VERSION   AGE
quickstart   green    1       7.6.2     8m39s
vagrant@kmaster:~$ kubectl get service quickstart-kb-http
NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
quickstart-kb-http   ClusterIP   10.109.179.162   <none>        5601/TCP   8m47s
vagrant@kmaster:~$ kubectl get pod --selector='kibana.k8s.elastic.co/name=quickstart'
NAME                             READY   STATUS    RESTARTS   AGE
quickstart-kb-6f487c444d-7kzwb   1/1     Running   0          9m11s
kubectl edit service quickstart-kb-http

$ kubectl get service quickstart-kb-http
NAME                 TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
quickstart-kb-http   NodePort   10.109.179.162   <none>        5601:31675/TCP   12m

注意问题:

假如你在使用如下的命令登录你 pod 中的 container 时,有遇到这样的问题:

$ kubectl exec -it <pod-name> -- sh

error: unable to upgrade connection: pod does not exist

这个时候,你需要参考文章 “Kubernetes 集群中节点的 INTERNAL-IP 问题”。

 

参考:

【1】https://phoenixnap.com/kb/install-kubernetes-on-ubuntu

【2】https://blog.csdn.net/wangchunfa122/article/details/86529406

【3】https://www.cnblogs.com/Leo_wl/p/8511902.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值