在 KVM 上搭建 Kubernetes
在KVM上搭建Kubernetes。
Kubernetes Istio Calico 鸟 BGP
● 在Kubernetes中想要做什么。
我特别没有任何想做的事情。作为一名基础设施工程师,我开始学习关于Kubernetes的知识。我选择在家里的个人电脑的KVM上来进行这个环境的搭建。
操作系统是使用以下操作系统的全部,包括主机。
CentOS Linux 发行版 7.6.1810 (Core)
在KVM上创建以下的虚拟机:
桌面:2个CPU、4GB内存、50GB硬盘
Kubernetes主节点:2个CPU、4GB内存、50GB硬盘、192.168.122.100、master.testk.jp
Kubernetes节点01:2个CPU、4GB内存、20GB硬盘、192.168.122.101、node01.testk.jp
Kubernetes节点02:2个CPU、4GB内存、20GB硬盘、192.168.122.102、node02.testk.jp
顺便提一下,KVM相关的软件包都是通过yum进行安装的。
● 簡要介紹導入步驟
以下是按照顺序进行介绍:
1. 操作系统设置
2. 安装Docker
3. 安装Kubernetes
4. 设置Kubernetes主节点
5. 安装Calico
6. 加入Kubernetes节点
7. 创建kiali密钥
8. 安装Istio

在命令表示中,执行用户将在开头进行区分。
# root 用户
$ kubernetes 用户 ( kuberus )
在安装 Kubernetes 之前,我们需要在主节点 node01 和 node02 上都进行操作。
1. 操作系统设置
在引入Kubernetes之前,需要进行必要的配置。
パッケージのアップデート
# yum -y update
hosts 登録
# cat << EOF >> /etc/hosts
192.168.122.100 master.testk.jp
192.168.122.101 node01.testk.jp
192.168.122.102 node02.testk.jp
EOF
グループ追加
# groupadd -g 3000 kubergr
ユーザ追加
# useradd -g 3000 -u 3001 kuberus
# passwd kuberus
sudo 実行可能に
# gpasswd -a kuberus wheel
● SELinux を無効化
# sed -i -e "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
# setenforce 0
firewalld を無効化
# systemctl disable firewalld && systemctl stop firewalld
2. 安装Docker
安装Docker CE。
Docker CE リポジトリ 設定
# curl -L https://download.docker.com/linux/centos/docker-ce.repo \
-o /etc/yum.repos.d/docker-ce.repo
# sed -i -e "s/^enabled=1/enabled=0/" /etc/yum.repos.d/docker-ce.repo
Docker CE インストール
# yum -y install docker-ce --enablerepo=docker-ce-stable
Docker CE バージョン確認
# docker --version
Docker CE 的安装设置
Docker グループへユーザの追加
# gpasswd -a kuberus docker
サービス設定ファイルのコピー
# cp /usr/lib/systemd/system/docker.service /etc/systemd/system
Docker 自動起動設定
# systemctl enable docker && systemctl start docker
Docker bridge 無効化
# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl --system
由于Kubernetes的Cgroup驱动程序已经推荐使用systemd,所以将将Docker的Cgroup驱动程序更改为systemd。
# cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
# systemctl daemon-reload
# systemctl restart docker
# docker info | grep -i cgroup
Cgroup Driver: systemd
3. Kubernetes 安装
使用Istio 1.2兼容的版本安装Kubernetes。
目前看来还没有测试最新版本。
在Kubernetes上安装。
kubernetes のリポジトリ登録
# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=0
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
Kubernetes のインストール Istio が対応するバージョン
# yum install -y kubelet-1.14.3 kubeadm-1.14.3 kubectl-1.14.3 --enablerepo=kubernetes
kubelet の自動起動設定
# cp /usr/lib/systemd/system/kubelet.service /etc/systemd/system
# systemctl enable kubelet
我们将与主节点共同完成到目前为止的工作。
4. Kubernetes 主节点设置
使用 kubeadm 工具来配置 Kubernetes。
Kubernetes Master セットアップ
$ sudo kubeadm init \
--apiserver-advertise-address=192.168.122.100 \
--pod-network-cidr=10.100.0.0/16
在 Kubernetes Master 安装过程的日志中,有一部分以 kubeadm join 开头。
这是用于 Kubernetes Node 加入的命令。
管理ユーザの設定
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ kubectl get node
5. 安装 Calico
进行Calico的安装和设置calicoctl。
Calico 用yamlファイルのダウンロード
$ mkdir calico
$ cd calico
$ curl -OL https://docs.projectcalico.org/v3.7/manifests/calico.yaml
Calico 用yamlファイルの編集
$ grep -n -A1 CALICO_IPV4POOL_IPIP calico.yaml
$ grep -n -A1 CALICO_IPV4POOL_CIDR calico.yaml
$ sed -i -e "600 s/Always/off/" calico.yaml
$ sed -i -e "611 s/192.168.0.0/10.100.0.0/" calico.yaml
$ grep -n -A1 CALICO_IPV4POOL_IPIP calico.yaml
$ grep -n -A1 CALICO_IPV4POOL_CIDR calico.yaml
Calico のインストール
$ kubectl apply -f calico.yaml
calicoctl のダウンロード
$ cd /usr/local/bin/
$ sudo curl -O -L \
https://github.com/projectcalico/calicoctl/releases/download/v3.7.3/calicoctl
$ sudo chmod +x calicoctl
calicoctl の環境設定
$ cat << EOF >> ~/.bash_profile
export DATASTORE_TYPE=kubernetes
export KUBECONFIG=~/.kube/config
EOF
$ calicoctl get node
6. Kubernetes节点加入
node01和node02双方执行以下命令。
# kubeadm join 192.168.122.100:6443 --token xxxxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:yyyyyyyyyyyyyyyyyyyy
7. 创建 Kiali 的秘密
master で実行します。
管理ユーザの設定が master だけになっているので master での作業になります。
Kiali のUIへ接続しようとするとき、先に行うのがいいみたいです。
なぜかまでは分かっていません。
Kiali Secret の作成
$ KIALI_USERNAME=$(read -p 'Kiali Username: ' uval && echo -n $uval | base64)
$ KIALI_PASSPHRASE=$(read -sp 'Kiali Passphrase: ' pval && echo -n $pval | base64)
$ NAMESPACE=istio-system
$ kubectl create namespace $NAMESPACE
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: kiali
namespace: $NAMESPACE
labels:
app: kiali
type: Opaque
data:
username: $KIALI_USERNAME
passphrase: $KIALI_PASSPHRASE
EOF
8. 安装 Istio
安装 Helm 和 Tiller,并使用 Helm 创建安装用的 YAML 文件,然后进行安装。
Istio ダウンロード
$ mkdir istio
$ cd istio/
$ curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.2.2 sh -
$ sudo cp istio-1.2.2/bin/istioctl /usr/local/bin/
Helm インストール
$ mkdir ~/helm
$ cd ~/helm
$ curl -OL \
https://storage.googleapis.com/kubernetes-helm/helm-v2.14.1-linux-amd64.tar.gz
$ tar zxf helm-v2.14.1-linux-amd64.tar.gz
$ sudo cp linux-amd64/helm /usr/local/bin/
$ helm version
Tillerのインストール
$ kubectl apply -f \
/home/kuberus/istio/istio-1.2.2/install/kubernetes/helm/helm-service-account.yaml
$ helm init --service-account tiller
$ helm install /home/kuberus/istio/istio-1.2.2/install/kubernetes/helm/istio-init \
--name istio-init --namespace istio-system
$ helm repo add istio.io \
https://storage.googleapis.com/istio-release/releases/1.2.2/charts/
Istio のインストール
$ helm template /home/kuberus/istio/istio-1.2.2/install/kubernetes/helm/istio \
--set kiali.enabled=true \
--set "kiali.dashboard.jaegerURL=http://jaeger-query:16686" \
--set "kiali.dashboard.grafanaURL=http://grafana:3000" \
--set gateways.istio-ingressgateway.type=NodePort \
--set gateways.istio-egressgateway.type=NodePort \
--name istio --namespace istio-system \
> /home/kuberus/istio/kiali.yaml
$ kubectl apply -f /home/kuberus/istio/kiali.yaml
我已经成功进行了所期望的设置。
为了连接到Kiali的UI界面,你需要将service/kiali设置为NodePort。
我已按照以下方式执行了操作。
kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
labels:
app: kiali
chart: kiali
heritage: Tiller
release: istio
name: kiali
namespace: istio-system
spec:
ports:
- name: http-kiali
port: 20001
protocol: TCP
targetPort: 20001
nodePort: 32001
selector:
app: kiali
sessionAffinity: None
type: NodePort
EOF
我成功地连接到了192.168.122.100:32001,并且能够顺利访问Kiali的用户界面。