在今天的文章中,我们将详细介绍如何创建自己的 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