k8s容器技术

第四章 Kubernetes入门及集群搭建

2022-01-27  本文已影响0人  InsaneLoafer

学习目标:

  1. 了解 Kubernetes 的起源和发展

  2. 掌握如何使用 kubeadm搭建 Kubernetes 集群

  3. 查看 Kubernetes 集群部署状态


4-1 Kubernetes的起源和发展

Kubernetes 的起源

  1. 将应用水平扩容到多个集群

  2. 为扩容的实例提供负载均衡的策略

  3. 提供基本的健康检查和自愈能力

  4. 实现任务的统一调度

Kubernetes 的发展


4-2 为什么需要 Kubernetes?

传统的容器编排痛点

容器技术虽然解决了应用和基础设施异构的问题,让应用可以做到一次构建,多次部署,但在复杂的微服务场景,单靠 Docker 技术还不够,它仍然有以下问题没有解决:

Kubernetes 能解决的问题

什么时候使用 Kubernetes?

什么时候不适合使用 Kubernetes


4-3 Kubernetes 的架构和核心概念

image

主控制节点组件

主控制节点组件对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的 replicas 字段时,启动新的 pod)。

主控制节点组件可以在集群中的任何节点上运行。 然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有主控制节点组件,并且不会在此计算机上运行用户容器。

  1. 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。

  2. 副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。

  3. 终端控制器(Endpoints Controller): 填充终端(Endpoints)对象(即加入 Service 与 Pod)。

  4. 服务帐户和令牌控制器(Service Account & Token Controllers),为新的命名空间创建默认帐户和 API 访问令牌.

从节点组件

节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。

kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。

插件(Addons)


4-4 Kubernetes 的部署方案介绍

部署目标

部署架构

image.png

环境准备


4-5 Virtualbox 虚拟机配置双网卡实现固定IP

vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
#BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=08012b4a-d6b1-41d9-a34d-e0f52a123e7a
DEVICE=enp0s3
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.99.101

systemctl restart network

[root@localhost Final]#ip addr |grep 192
inet 192.168.99.101/24 brd 192.168.99.255 scope global noprefixroute enp0s3
ping 192.168.31.178
PING 192.168.31.178 (192.168.31.178): 56 data bytes
64 bytes from 192.168.31.178: icmp_seq=0 ttl=64 time=0.060 ms

4-6 Master节点安装 kubeadm, kubelet and kubectl

vim /etc/hosts
192.168.56.101 master
192.168.56.102 node1
192.168.56.103 node2
vi /etc/resolv.conf
# Generated by NetworkManager
search lan
nameserver 114.114.114.114
image

剩余步骤可通过这个脚本执行:

base_install.sh

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

yum install wget net‐tools ntp vim bash‐comp* ‐y

ntpdate 0.asia.pool.ntp.org

[root@master ~]# modprobe br_netfilter
[root@master ~]# echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
[root@master ~]# vi /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
image
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

也可以修改 /etc/selinux/config 文件,如图片中所示

image
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

也可以直接编辑 /etc/fstab 文件注释掉图片的内容

image image
[root@master ~]# hostnamectl set-hostname master
[root@master ~]# su ‐
[root@master ~]# cat >>/etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
[root@master ~]# yum repolist
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce

mkdir /etc/docker

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://6yus5ux3.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

如果报错如下,则重新下载
wget -O /etc/yum.repos.d/CentOS-Base.repo [http://mirrors.aliyun.com/repo/Centos-7.repo](http://mirrors.aliyun.com/repo/Centos-7.repo)

image

如果还不行就使用以下脚本:

curl -fsSL get.docker.com -o get-docker.sh
bash get-docker.sh
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
# Restart Docker
systemctl daemon-reload
systemctl enable docker
systemctl restart docker

此时查看 docker info,可以看到默认 Cgroup Driversystemd

yum remove -y kubelet kubeadm kubectl

yum install -y kubelet kubeadm kubectl

systemctl enable kubelet && systemctl start kubelet

之后便可给Master节点打上快照,然后worker节点便可用这个快照进行构建。


4-8 初始化Master 节点

[root@master ~]# hostnamectl set-hostname master
[root@master ~]# su ‐
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
vi /etc/sysctl.d/k8s.conf 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

剩余操作可通过以下脚本执行:注意修改版本和节点地址

init_master.sh

image
kubeadm init --kubernetes-version=1.23.1 \
--apiserver-advertise-address=192.168.56.101 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
kubeadm join 192.168.56.101:6443 --token j0tuuf.p635m3gjlcn3d2w7 \
        --discovery-token-ca-cert-hash sha256:b072d61cbfe86def68800a610e2f9eac45c34e83a55c6dab14691bf8a64cd4c1
image
NAME     STATUS     ROLES                  AGE     VERSION
master   NotReady   control-plane,master   6m26s   v1.23.1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml<
kubectl apply -f kubeblog/docs/Chapter4/flannel.yaml
image

这个文件将flannel镜像上传到了dockerhub https://hub.docker.com/repository/docker/wangqingjiewa/flannel

[root@master ~]# kubectl get po -n kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-6d8c4cb4d-r7q7n          1/1     Running   0          17m
coredns-6d8c4cb4d-sfqlb          1/1     Running   0          17m
etcd-master                      1/1     Running   0          18m
kube-apiserver-master            1/1     Running   0          18m
kube-controller-manager-master   1/1     Running   0          18m
kube-flannel-ds-chd2n            1/1     Running   0          101s
kube-proxy-p42n2                 1/1     Running   0          17m
kube-scheduler-master            1/1     Running   0          18m
[root@master ~]# kubectl get node
NAME     STATUS   ROLES                  AGE   VERSION
master   Ready    control-plane,master   21m   v1.23.1

ifconfig |grep flannel

报错处理

# 检查权限
chmod 777 /run/flannel/subnet.env
kubectl describe pod kube-flannel-ds-xxx -n kube-system
kubectl get pod kube-flannel-ds-xx -n kube-system -o yaml
kubectl delete -f flannel.yaml
kubectl create -f flannel.yaml

docker ps

如果出现“The connection to the server 192.168.56.101:6443 was refused - did you specify the right host or port?"错误

先执行: kubectl get po -n kube-system ,查看所有服务是否正常启动,如果某个服务启动失败,则执行

kubectl describe pod <pod name> -n kube-system

查看错误原因。

kubeadm reset


4-9 安装配置 worker Node节点

hostnamectl set-hostname node1
vi /etc/hosts
192.168.99.101 master
192.168.99.102 node1
192.168.99.103 node2
yum install openssh-server
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.56.101
reboot -f

如果安装有报错:没有安装deltarpm就执行以下命令

yum provides '*/applydeltarpm'

yum -y install deltarpm

scp /etc/kubernetes/admin.conf root@node1ip:/etc/kubernetes/

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

yum install net-tools

kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/chi/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
systemctl start docker
systemctl start kubelet
systemctl enable kubelet.service
kubeadm join 192.168.99.101:6443 --token vrqf1w.dyg1wru7nz0ut9jz    --discovery-token-ca-cert-hash sha256:1832d6d6c8386de5ecb1a7f512cfdef27a6d14ef901ffbe7d3c01d999d794f90

默认token的有效期为24小时,当过期之后,该token就不可用了。解决方法如下:

重新生成新的token,在master端执行

kubeadm token create --print-join-command

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

在node1节点上面创建目录: mkdir -p /etc/cni/net.d/

在master: scp /etc/cni/net.d/* root@nodeip:/etc/cni/net.d/

执行命令: kubectl get nodes 查看 node 节点处于ready状态

kubectl get nodes
image

4-10 剖析kubeadm安装原理

Init 命令的工作流程

kubeadm init命令通过执行下列步骤来启动一个 Kubernetes Control Plane节点。

  1. 运行一系列的预检项来验证系统状态。一些检查项目仅仅触发警告, 其它的则会被视为错误并且退出 kubeadm,除非问题得到解决或者用户指定了 --ignore-preflight-errors= 参数。

  2. 生成一个自签名的CA证书(或者使用现有的证书,如果提供的话)来为集群中的每一个组件建立身份标识。如果用户已经通过--cert-dir配置的证书目录(默认为/etc/kubernetes/pki)提供了他们自己的 CA 证书以及/或者密钥,那么将会跳过这个步骤,正如文档使用自定义证书所述。

  3. kubeconfig文件写入/etc/kubernetes/目录,以便kubelet、控制器管理器和调度器用来连接到API 服务器,它们每一个都有自己的身份标识,同时生成一个名为 admin.conf的独立的 kubeconfig文件,用于管理操作。

  4. 为 API服务器、控制器管理器和调度器生成静态Pod的清单文件。静态Pod的清单文件被写入到/etc/kubernetes/manifests目录;kubelet 会监视这个目录以便在系统启动的时候创建 Pod。一旦Control Plane的 Pod 都运行起来, kubeadm init的工作流程就继续往下执行。

  5. Control Plane节点应用 labels 和 taints 标记以便不会在它上面运行其它的工作负载。

  6. 生成令牌以便其它节点以后可以使用这个令牌向Control Plane节点注册自己。

  7. Kubeadm 会创建 configmap,提供添加节点所需要的信息。

查看创建的configmap

image image

安装问题

systemctl status kubelet
journalctl -xefu kubelet
journalctl -u kube-apiserver

注意:使用Kubelet describe 查看日志,一定要注意是否应包含命名空间

kubectl describe pod kubernetes-dashboard-xxx --namespace
kubectl logs -f pods/monitoring-influxdb-xxx -n kube-system
kubectl logs --tail 200 -f podname -n jenkins

执行 kubeadm reset,并且将 cni0,flannel1.1,docker0等网络规则删除,参考 Worker node 安装的章节。

修改 yaml 文件中的 image路径


4-11 安装Dashboard

https://www.yuque.com/insaneloafer/eqq96o/kssab0?inner=ltYwM

image
spec:
    type: NodePort
  ports:
  - port: 443
    targetPort: 8443
    nodePort: 31111
  selector:
    k8s-app: kubernetes-dashboard
kubectl create -f kubernetes-dashboard.yaml
kubectl apply -f kubernetes-dashboard.yaml
image
kubectl get pod,svc -n kubernetes-dashboard
image

通过chrome浏览器访问https://192.168.99.102:31111,此时会返回“Your connection is not private”,无法跳转页面到Dashboard,这是由于 chrome 的安全设置,解决办法:鼠标点击当前页面,直接键盘输入thisisunsafe,然后回车,即可进行页面跳转至 Dashboard登录页

kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token 
image

在登录页面输入之前生成的 token,即可完成登录。

image image
上一篇 下一篇

猜你喜欢

热点阅读