【应用】Kubernetes

Kubernetes

  • k8s 安装流程
    • 安装前配置
    • 安装 docker 以及 k8s 组件
    • 初始化 k8s 集群
    • 测试使用:安装 kubernetes-dashboard
  • k8s 基础概念
    • k8s 核心技术概念
    • k8s 内部组件
    • k8s 中的 IP 地址
    • K8S 服务暴露的三种方式

k8s 安装流程

k8s-master k8s-node01 k8s-node02
192.168.86.140 192.168.86.141 192.168.86.142

使用的虚拟机系统为 centOS 7,三台机器配置均为 2 核 4 G;

安装前配置

在进行安装前需要在每一台节点服务器执行下列配置

关闭防火墙服务

systemctl stop firewalld
systemctl disable firewalld

关闭 selinux,修改/etc/selinux/config配置文件,设置SELINUX=disabled

vi /etc/selinux/config

关闭 swap 分区,修改/etc/fstab配置文件

vi /etc/fstab
# 将下面这行配置注释掉
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

添加主机名与 ip 的映射关系,修改各个节点的/etc/hosts,添加下列配置

192.168.86.140 k8s-master
192.168.86.141 k8s-node01
192.168.86.142 k8s-node02

分别在每一个节点修改主机名

hostnamectl set-hostname k8s-master # 192.168.86.140
hostnamectl set-hostname k8s-node01 # 192.168.86.141
hostnamectl set-hostname k8s-node02 # 192.168.86.142

将桥接的 IPv4 流量传递到 iptables 的链,然后重新加载系统配置

cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system # 重新加载系统配置

为避免低内核产生问题,将所有机器的内核进行升级

查看当前版本内核

uname -a
# 当前内核如下
Linux k8s-node01 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

执行升级,安装 epel 源

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

查看内核版本并安装最新版本(这里安装的是 5.4.224 版本)

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

安装最新 lt 内核版本

yum --disablerepo='*' --enablerepo=elrepo-kernel install kernel-lt -y

查看系统 grub 内核的启动列表,这里编号 0 的 5.4.224 的 lt 版本是我们新安装的

awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

指定以新安装的编号 0 的内核版本为默认启动内核,重新启动服务器

grub2-set-default 0
reboot

卸载旧内核版本

yum remove kernel -y

查看内核版本是否已经升级完毕

uname -a
# 当前内核版本如下
Linux k8s-node01 5.4.224-1.el7.elrepo.x86_64 #1 SMP Tue Nov 8 17:24:56 EST 2022 x86_64 x86_64 x86_64 GNU/Linux

安装 docker 以及 k8s 组件

安装常用软件包

yum install vim bash-completion net-tools gcc -y

使用 aliyun 数据源安装 docker-ce,并设置开机自启

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
systemctl enable docker

安装完 docker 后添加 aliyun 的 docker 仓库加速器(注册获取专属加速器地址)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

安装kubectl、kubelet、kubeadm,首先配置阿里 k8s 源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

执行 kubectl、kubelet、kubeadm 安装,并设置 kubelet 开机启动

yum -y install kubectl-1.18.0 kubelet-1.18.0 kubeadm-1.18.0
systemctl enable kubelet

初始化 k8s 集群

初始化 master 节点(注意,要求 master 节点至少为双核)

kubeadm init --kubernetes-version=1.18.0  \
--apiserver-advertise-address=192.168.86.140   \
--image-repository registry.aliyuncs.com/google_containers  \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.100.0.0/16

初始化成功终端将打印下列信息,最后两行信息需要其他节点在加入集群时执行

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 192.168.86.140:6443 --token 2xx8pk.0pz1axnn4ujkp4hh \
    --discovery-token-ca-cert-hash sha256:b16181c504732670348e871158e701138e884959b1bd6ba5833e442aef3d213c

创建 kubectl

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

在 master 节点安装 calico 网络,第二行中的10.100.0.0需要与初始化 master 时设置的pod-network-cidr相同

curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
sed -i 's/192.168.0.0/10.100.0.0/g' calico.yaml
kubectl apply -f calico.yaml

在 node01 和 node02 节点执行命令加入集群

kubeadm join 192.168.86.140:6443 --token 2xx8pk.0pz1axnn4ujkp4hh     --discovery-token-ca-cert-hash sha256:b16181c504732670348e871158e701138e884959b1bd6ba5833e442aef3d213c

在 node01 和 node02 节点创建 kubectl

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

至此可以在任意节点查询集群节点状态

kubectl get nodes

至此 k8s 集群配置完成!

测试使用:安装 kubernetes-dashboard

Dashboard 是可视化插件,它可以给用户提供一个可视化的 Web 界面来查看当前集群的各种信息。用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。

下载相应的 yaml 文件到本地

curl https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml -O

修改配置文件 yaml 文件

vim recommended.yaml

在文件中添加类型与映射端口号,如图所示

【应用】Kubernetes_第1张图片

启动服务

kubectl create -f recommended.yaml

查看服务启动情况

kubectl get pod --all-namespaces -o wide

【应用】Kubernetes_第2张图片

访问https:ip:30000,登录需要 token,查询 token 获取的服务名

kubectl -n kubernetes-dashboard get secret

使用下列指令获取 token,-n kubernetes-dashboard后面的名字需要与刚才查询出的名称前缀为kubernetes-dashboard-token的服务名相同

kubectl describe secrets -n kubernetes-dashboard kubernetes-dashboard-token-d9tqk  | grep token | awk 'NR==3{print $2}'

填入查询出的 token,即可登录到页面(使用谷歌浏览器会被拒绝访问,可以使用 Microsoft Edge)

【应用】Kubernetes_第3张图片

若存在权限报错问题,参考kubernetes dashboard 授权/权限/角色绑定问题导致页面报错

k8s 基础概念

kubernetes 是基于容器技术的分布式架构

k8s 核心技术概念

Master

  • Master 是整个集群的大脑,负责整个集群的管理和调度。

Node

  • Node 是集群中的工作节点,是应用容器真正运行的节点。

  • Node 受 Master 控制并向其汇报容器运行的状态。

Pod

  • Pod 是一个或者多个容器的集合,是 k8s 执行调度的最小单位,运行在每个节点上的应用实际上就是一个 Pod。

  • Pod 实际上是对一组容器的封装,同一 Pod 中的容器会被 Master 一起调度到某个 Node 上运行。

  • Pod 中的容器可以通过 Valume 共享存储,且共享 ip 地址。

Service

  • Service 是对一组 Pod 的封装,其负责发现 Pod 服务并维护 Pod-ip 列表。

  • Service 对外提供自己的 ip 和端口,实现外界对这一组 Pod 的访问,并为 Pod 提供负载均衡。

  • Service 对外提供多种入口:

    • ClusterIP:创建一个虚拟的 ip 地址,该地址在集群内唯一且不可修改,通过这个唯一的 ip 可以访问 Pod;

    • NodePort:Service 会在每一个 Node 都开放一个端口,可以通过任意 Node 的 ip + 端口号的方式访问 Pod;

    • LoadBalancer:在 NodePort 的基础上,创建一个外部的负载均衡器,并将所有请求都转发到 NodeIP:NodePort;

    • ExternalName:将服务通过 DNS CNAME 的方式转发到指定的域名(通过 spec.externalName 进行配置);

Deployment

  • Deployment 可以部署和管理应用,其可以管理多个 Pod 副本,并保证 Pod 按照期望的状态运行。

  • Deployment 通过 yml 配置文件去描述应用,并根据配置文件中的描述对应用进行管理。

k8s 内部组件

【应用】Kubernetes_第4张图片

在 master 节点查询所有的服务

kubectl get pods --all-namespaces -o wide

【应用】Kubernetes_第5张图片

k8s 的主要组件主要包括五部分:

  • kube-apiserver:提供 REST 接口实现认证、授权、访问控制以及服务发现等功能;

  • kube-controller:维护 k8s 集群状态;

  • kube-proxy:管理 Service 的访问入口,对请求进行转发,包括 Pod 到 Service 以及集群外到 Service;

  • kube-scheduler:提供对 Pod 的调度管理;

  • kubelet:部署在 Node 节点的守护进程,与 apiserver 通信执行调度命令并且汇报 Node 的状态;

k8s 中的 IP 地址

Node IP

Node IP 就是物理机的 IP 地址,即我们的服务器或者虚拟机的 ip。当 Service 在 Node 节点开放一个端口时,外界可以通过 Node IP:端口号 的形式访问应用,就跟直接将应用部署在服务器相同。

在 k8s 查询 Node IP

kubectl get node
kubectl describe node <Node name>

Pod IP

Pod IP 是 Docker Engine 根据 Docker 网桥的 IP 地址进行分配的。相同 Service 下的 Pod 可以通过 Pod IP 相互访问;不同 Service 下的 Pod 通信则需要通过 Cluster IP。集群外访问 Pod 则需要通过 Node IP。

在 k8s 查询 Pod IP

kubectl get pods --all-namespaces
kubectl describe pods <Pod name> -namespace <Namespace>

Cluster IP

Cluster IP 即 Service IP,是一个虚拟 ip 地址,用于集群内各个服务间通信使用。

在 k8s 查询 Cluster IP

kubectl get services
kubectl describe service <Service name>

外部访问时的请求转发

由 Node IP + port 转发至 Service IP 再转发到对应的 Pod IP,实现访问

【应用】Kubernetes_第6张图片

K8S 服务暴露的三种方式

NodePort

该方式需要指定服务对外暴露的接口,k8s 会在每一台服务器节点都开放该端口供外部请求进行访问。请求会被转发到 Service 进而转发到 Pod,请求过程如上图所示。

对外开放的端口号在创建 Service 的 yaml 文件中指定,通过spec.ports.nodePort参数进行配置,若不指定则 k8s 会随机选择一个端口号。

在生产环境中注意开放服务器的对应端口。

LoadBalance

该方式在 NodePort 的基础上,在各个开放的端口外包装了一层负载均衡器,该均衡器提供一个统一的 ip + 端口号 供外部访问,并将访问的请求均衡的分配给每个节点,而在 NodePort 模式中并没有进行负载均衡。

该方式的每一个负载均衡器都会暴露一个 ip + 端口号,因此无法做到通过统一的 ip 入口访问到所有的服务。其请求转发过程如下图所示。

【应用】Kubernetes_第7张图片

Ingress

采用 NodePort 模式,将在每个服务器节点开启一个端口,若提供的服务很多,则开放的端口数量非常庞大,难以维护;采用 LoadBalance 模式,每一个服务都将拥有一个公网 ip,服务数量大时同样不好维护。

通过 Ingress 模式可以通过一个 Ingress 暴露多个服务,可以将其理解为可以动态配置服务地址的 Nginx,其本质就是一个微服务网关。

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP和HTTPS。Ingress 可以提供负载均衡、SSL 和基于名称的虚拟托管。

【应用】Kubernetes_第8张图片

你可能感兴趣的:(docker,kubernetes,docker,运维)