Notas de estudo do Kubernetes
Esta seção apresenta principalmente:
- Alguns conhecimentos básicos de Kubernetes
- Conteúdo operacional relacionado à construção de cluster Kubernetes
Prefácio
1. Evolução da implantação:
O processo de evolução de toda a implantação é mostrado na figura:
-
Era de implantação tradicional:
- Execute o aplicativo em um servidor físico
- Não é possível definir limites de recursos para o aplicativo
- levando a problemas de alocação de recursos
Se você executar vários aplicativos em um servidor físico, poderá ocorrer uma situação em que um aplicativo ocupe a maior parte dos recursos, causando degradação do desempenho de outros aplicativos. Uma solução é executar cada aplicativo em um servidor físico diferente, mas isso não é escalonável devido à subutilização de recursos e o custo de manutenção de muitos servidores físicos é alto.
-
Implantação de virtualização
- A tecnologia de virtualização permite que várias máquinas virtuais sejam executadas na CPU de um único servidor físico
- A virtualização permite que os aplicativos sejam isolados entre máquinas virtuais e fornece certa segurança processual para que os aplicativos não possam ser acessados à vontade.
- A tecnologia de virtualização pode utilizar melhor os recursos em servidores físicos
- Cada máquina virtual é um computador completo, executando todos os componentes no hardware virtualizado, incluindo seu próprio sistema operacional, etc.
Desvantagens: Cada máquina virtual possui seu próprio sistema operacional, etc., e a camada virtual é redundante, resultando em desperdício de recursos e degradação de desempenho.
-
Implantação em contêiner
- Os contêineres são semelhantes às máquinas virtuais, mas o sistema operacional pode ser compartilhado entre aplicativos (há apenas uma cópia do sistema operacional e ela é compartilhada entre cada programa)
- Os contêineres são semelhantes às máquinas virtuais e possuem seu próprio sistema de arquivos, CPU, memória, espaço de processo, etc.
- Devido à separação de contêineres e infraestrutura, ele pode ser facilmente transplantado entre nuvens e distribuições Linux.
1. kubernetes
Introdução
1.1 Visão geral
Ékubernetes (k8s)
uma plataforma de código aberto portátil e extensível para gerenciar cargas de trabalho e serviços em contêineres que facilita a configuração declarativa e a automação. Kubernetes
Possui um ecossistema grande e em rápido crescimento. Kubernetes
Serviços, suporte e ferramentas estão amplamente disponíveis. k8s
Esta abreviatura se deve ao relacionamento de oito caracteres entre k e s.
Kubernetes
Dando-nos a seguinte funcionalidade:
- Autocorreção : quando um contêiner trava, um novo contêiner pode ser iniciado rapidamente em cerca de 1 segundo
- Escalonamento automático : o número de contêineres em execução no cluster pode ser ajustado automaticamente conforme necessário.
- Descoberta de serviço : um serviço pode encontrar os serviços dos quais depende por meio da descoberta automática
- Balanceamento de carga : se um serviço iniciar vários contêineres, o balanceamento de carga das solicitações pode ser realizado automaticamente
- Reversão de versão : Se você encontrar um problema com a versão do programa recém-lançada, poderá reverter imediatamente para a versão original.
- Orquestração de armazenamento : Os volumes de armazenamento podem ser criados automaticamente de acordo com as necessidades do próprio contêiner
1.2 componentes do Kubernetes
Um kubernetes
cluster é composto principalmente por um nó de controle (mestre) e um nó de trabalho (nó), e diferentes componentes são instalados em cada nó.
mestre: o plano de controle do cluster, responsável pela tomada de decisão (gerenciamento) do cluster
ApiServer
: A única entrada para operações de recursos, recebe comandos inseridos pelos usuários e forneceAPI
mecanismos como autenticação, autorização, registro e descoberta.
Scheduler
: responsável pelo agendamento de recursos do cluster e agendamento de pods para nós correspondentes de acordo com a estratégia de agendamento predeterminada.
ControllerManager
: Responsável por manter o status do cluster, como arranjos de implantação de programas, detecção de falhas, expansão automática, atualizações contínuas, etc.
Etcd
: Responsável por armazenar informações sobre vários objetos de recursos no cluster
nó: o plano de dados do cluster, responsável por fornecer o ambiente operacional (trabalho) para o contêiner
Kubelet : Responsável por manter o ciclo de vida do container, ou seja, criar, atualizar e destruir o container controlando o docker
KubeProxy
: Responsável por fornecer descoberta de serviço e balanceamento de carga dentro do clusterpod : Pod é outro encapsulamento do contêiner. Um pod pode conter vários contêineres.
- O que o docker run inicia é um contêiner. O contêiner é a unidade básica do Docker. Um aplicativo é um contêiner.
kubectl run
O que é iniciado é um aplicativo chamado Pod, e Pod éKubernetes
a unidade básica.Docker : Responsável por diversas operações de containers em nós
A seguir, implante um serviço nginx para ilustrar o relacionamento de chamada entre vários componentes do sistema Kubernetes:
-
Em primeiro lugar, deve ficar claro que uma vez
kubernetes
iniciado o ambiente, tanto o mestre quanto o nó armazenarão suas próprias informações noetcd
banco de dados. -
Uma
nginx
solicitação de instalação de serviço será enviada primeiro ao componentemaster
do nóapiServer
-
apiServer
node
O componente chamará o componente agendador para determinar em qual nó o serviço deve ser instalado .Nesse momento, ele irá ler as informações de cada nó do etcd, depois selecionar de acordo com um determinado algoritmo e informar o resultado ao apiServer.
-
apiServer
Liguecontroller-manager
para agendar o serviçoNode
de instalação do nónginx
-
kubelet
Após receber a instrução, ele será notificadodocker
edocker
então iniciaránginx
umpod
pod
Simkubernetes
, a menor unidade operacional em que o contêiner deve funcionarpod
. Para esse fim, -
Um serviço nginx está em execução. Se precisar acessar o nginx, você precisará usar o kube-proxy para gerar um proxy de acesso para o pod.
nginx
Desta forma, usuários externos podem acessar serviços no cluster .
1.3 kubernetes
Glossário de termos
-
Mestre : nó de controle do cluster.Cada cluster requer pelo menos um nó mestre para ser responsável pelo gerenciamento e controle do cluster.
-
Nó : nó de carga de trabalho, o mestre aloca contêineres para esses nós de trabalho do nó e, em seguida, o docker no nó é responsável por executar o contêiner.
-
Pod :
kubernetes
a menor unidade de controle. Todos os contêineres são executados em pods. Pode haver um ou mais contêineres em um pod. -
Controlador : Controlador, por meio do qual os pods são gerenciados, como iniciar pods, interromper pods, dimensionar o número de pods, etc.
-
Serviço : Uma entrada unificada para serviços externos do pod. Vários pods do mesmo tipo podem ser mantidos abaixo.
-
Rótulo : Rótulo, usado para classificar pods. Pods do mesmo tipo terão o mesmo rótulo.
-
NameSpace
: Namespace, usado para isolar o ambiente de execução dos pods
2. Construção do ambiente de cluster
2.1 Introdução geral
1. Tipo de cluster:
Os clusters Kubernetes geralmente podem ser divididos em duas categorias:
- **Um mestre e vários escravos:** Um nó mestre e vários nós de nó. Este método é simples de configurar. Quando o host mestre falhar de forma anormal, todo o cluster ficará inativo, o que é mais adequado para ambientes de teste.
- Multi-mestre e multi-escravo: vários nós mestres e vários nós de nó. Este método é mais complicado de configurar, mas tem alta segurança. Quando um nó mestre falha, outros mestres podem assumir imediatamente o controle para garantir a operação normal do cluster.É usado principalmente para ambiente de produção.
2. Método de construção
Kubernetes tem uma variedade de métodos de implantação, os métodos convencionais atuais incluem kubeadm, minikube e pacotes binários.
-
minikube: uma ferramenta Kubernetes para construir rapidamente um único nó.
-
kubeadm: Uma ferramenta para construir clusters Kubernetes rapidamente (pode ser usada em ambientes de produção).
-
Pacote binário: Baixe o pacote binário de cada componente do site oficial e instale-o na ordem (recomendado para uso em ambientes de produção).
kubeadm é uma ferramenta lançada pela comunidade oficial para implantação rápida de clusters Kubernetes.Esta ferramenta pode completar a implantação de um cluster Kubernetes por meio de duas instruções:
- Crie um nó mestre kubeadm init
- Adicione o nó Node ao cluster atual $ kubeadm join <IP e porta do nó mestre>
Esta construção é realizada usando kubeadm.
3. Planejamento de hospedagem
Papel | endereço de IP | sistema operacional | Configuração |
---|---|---|---|
mestre | 192.168.79.100 | CentOS7.9 + servidor de infraestrutura | 2 núcleos 2G 20G |
nó1 | 192.168.79.101 | CentOS7.9 + servidor de infraestrutura | 2 núcleos 2G 20G |
nó2 | 192.168.79.102 | CentOS7.9 + servidor de infraestrutura | 2 núcleos 2G 20G |
Esta construção de cluster: 3 servidores CentOS, um mestre, dois nós (um mestre e dois escravos) Servidor de infraestrutura CentOS 7.9
Instale docker (18.06.3); kubeadm (1.17.4); kubelet (1.17.4); kubectl (1.17.4) em cada servidor
- Comunicação de rede entre todas as máquinas do cluster
- Pode acessar a rede externa, precisa extrair a imagem
- Desativar partição swap
2.2. Instale o CentOS 7 no VM Ware
Passos para instalar o CentOS7 no VMWare e configurar o endereço IP:
- Primeiro baixe e instale o software VM e a versão CentOS7 da imagem: Endereço de download:
Endereço para download do software:
Endereço de download do CentOS7 Alibaba Cloud: Clique aqui para baixar a imagem do CentOS7
VM Ware: Link do disco na nuvem: Link para download do disco na nuvem Código de extração: 5lgm
-
VM
Instale 3 servidores respectivamente através do softwareCentOS
, um é o master e dois são Node. Tome um deles como exemplo. Consulte outro artigo para o processo de instalação específico:CentOS7
Detalhes de instalaçãoClique aqui para ver o processo detalhado de instalação do CentOS7
2.3 Inicialização do ambiente
Após a instalação dos três servidores CentOS, conforme mostrado na figura, eles podem ser conectados através do software MobaXterm e três máquinas podem ser operadas ao mesmo tempo.
-
Verifique a versão de instalação do CentOS e certifique-se de que é CentOS7 ou superior.
# 此方式安装k8s集群要求CentOS 版本必须在7.5以之上,本次使用7.9版本 [root@master ~]# cat /etc/centos-release CentOS Linux release 7.9.2009 (Core) [root@master ~]#
-
Resolução de nome de domínio host
Para facilitar o acesso direto entre nós do cluster, configure a resolução de nomes de domínio do host.
#编辑三台服务器的/etc/hosts文件,在里面添加如下内容: 192.168.79.100 master 192.168.79.101 node1 192.168.79.102 node2
-
Sincronização de horário
k8s
É necessário que o horário do nó no cluster seja preciso e sempre utilizechronyd
um serviço para sincronizar o horário da rede.# 启动chronyd服务 [root@master ~]# systemctl start chronyd # 将其设置为开机自启动 [root@master ~]# systemctl enable chronyd # 查看当前三台机器的时间(只展示其中master一台) [root@master ~]# date 2022年 07月 01日 星期五 13:04:36 CST
-
Desative os serviços iptables e firewalld
k8s e docker irão gerar um grande número de regras de iptables durante a operação.Para não se confundir com as regras do sistema, feche diretamente as regras do sistema.
# 关闭firewalld [root@master ~]# systemctl stop firewalld # 设置为开启禁止自启 [root@master ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. # 关闭iptables (本机器没有iptales) [root@master ~]# systemctl stop iptables Failed to stop iptables.service: Unit iptables.service not loaded.
-
desabilitar selinux
selinux é um serviço de segurança do sistema Linux, se não for desligado, vários problemas ocorrerão durante a instalação do cluster.
# 编辑注册表/etc/selinux/config文件,修改SELINUX的值为disabled 修改完之后需要重启Linux服务才能生效 # 当前为开启状态 [root@master ~]# getenforce Enforcing # [root@master ~]# vim /etc/selinux/config # 进入该文件进行修改
-
Desativar partição swap
A partição swap é uma partição de memória virtual.Depois que a memória física é usada, o espaço em disco é virtualizado em memória para uso. Iniciar o dispositivo swap terá um impacto no desempenho do sistema, portanto desative a partição swap diretamente.
# 编辑分区的配置文件/etc/fstab 注释掉swap分区这一行内容,修改之后需要重启服务 [root@master ~]# vim /etc/fstab
-
Modifique os parâmetros do kernel Linux
#修改Linux的内核参数,添加网桥过滤和地址转发功能 # 编辑(新建)/etc/sysctl.d/kubernetes.conf文件,添加如下配置 net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 # 保存退出之后重新加载配置 [root@master ~]# sysctl -p # 加载网桥过滤模块 [root@master ~]# modprobe br_netfilter # 查看该模块是否加载成功 [root@master ~]# lsmod | grep br_netfilter br_netfilter 22256 0 bridge 151336 1 br_netfilter
-
ipvs
Função de configuraçãoExistem dois modos de proxy em , um é baseado em , e o outro é baseado em . Comparando os dois,
k8s
o desempenho de , é maior. Para usar este modo, você precisa carregar manualmente o módulo.service
iptables
ipvs
ipvs
ipvs
# 1.安装ipset和ipvsadm [root@master ~]# yum install ipset ipvsadmin -y 已加载插件:fastestmirror, langpacks Determining fastest mirrors * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com base | 3.6 kB 00:00:00 extras | 2.9 kB 00:00:00 updates | 2.9 kB 00:00:00 (1/4): base/7/x86_64/primary_db | 6.1 MB 00:00:00 (2/4): base/7/x86_64/group_gz | 153 kB 00:00:00 (3/4): extras/7/x86_64/primary_db | 247 kB 00:00:00 (4/4): updates/7/x86_64/primary_db | 16 MB 00:00:18 软件包 ipset-7.1-1.el7.x86_64 已安装并且是最新版本 没有可用软件包 ipvsadmin。 无须任何处理 # 2.添加需要加载的模块写入脚本文件 [root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules > #!/bin/bash > modprobe -- ip_vs > modprobe -- ip_vs_rr > modprobe -- ip_vs_wrr > modprobe -- ip_vs_sh > modprobe -- nf_conntrack_ipv4 > EOF # 3. 为脚本文件添加执行权限 [root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules # 4. 执行脚本文件 [root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules # 5. 查看对应模块是否加载成功 [root@node2 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4 nf_conntrack_ipv4 15053 0 nf_defrag_ipv4 12729 1 nf_conntrack_ipv4 ip_vs_sh 12688 0 ip_vs_wrr 12697 0 ip_vs_rr 12600 0 ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr nf_conntrack 139264 2 ip_vs,nf_conntrack_ipv4 libcrc32c 12644 3 xfs,ip_vs,nf_conntrack [root@master ~]#
-
Reinicie o servidor
[root@master ~]# reboot
-
Após reiniciar o serviço, verifique
selinux
se o desligamento foi bem-sucedido.# 显示Disabled 关闭成功 [root@master ~]# getenforce Disabled
2.4 Instalar janela de encaixe
-
A fonte de imagem oficial do Docker é lenta, mude para a fonte de imagem do Alibaba Cloud
# 切换为阿里云的镜像源 [root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
-
Verifique as versões do docker suportadas na fonte da imagem atual
# 支持的docker版本,本次选择 docker-ce-18.06.3.ce-3.el7 [root@master ~]# yum list docker-ce --showduplicates [root@master ~]#
-
Instale a versão especificada
docker-ce
# --setopt=obsoletes=0 表示指定安装对应版本 [root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
-
Adicione um arquivo de configuração
# Docker 默认情况下使用Cgroupfs,而k8s推荐使用systemd来替代cgroupfs, 更换下载的镜像源 [root@master ~]# mkdir /etc/docker [root@master ~]# cat <<EOF> /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"] } EOF
-
Iniciar janela de encaixe
# 启动docker [root@master ~]# systemctl restart docker # 设置为开机自启 [root@master ~]# systemctl enable docker
-
Verifique o status do docker e as informações da versão
#检查版本信息 [root@master ~]# docker version Client: Version: 18.06.3-ce API version: 1.38 Go version: go1.10.3 Git commit: d7080c1 Built: Wed Feb 20 02:26:51 2019 OS/Arch: linux/amd64 Experimental: false Server: Engine: Version: 18.06.3-ce API version: 1.38 (minimum version 1.12) Go version: go1.10.3 Git commit: d7080c1 Built: Wed Feb 20 02:28:17 2019 OS/Arch: linux/amd64 Experimental: false [root@master ~]#
2.5 Instalar kubernetes
componentes
-
Alternar fonte de imagem k8s
# k8s镜像源在国外,下载速度较慢,切换为阿里云的 # 编辑(新建文件)/etc/yum.repos.d/kubernetes.repo, 添加如下的配置: [root@master ~]# vim /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
-
Instalação
kubeadm
,kubectl
,kubelet
# 安装指定版本 1.17.4 [root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
-
Modificar arquivo de configuração
# 配置kubelet的cgroup, 编辑/etc/sysconfig/kubelet,添加如下配置: [root@master ~]# vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs"
-
Configure o kubelet para iniciar automaticamente na inicialização
[root@master ~]# systemctl enable kubelet
Todo o conteúdo das versões 2.2-2.5 anteriores precisa ser operado em três máquinas virtuais para se preparar para a construção de um ambiente de cluster.
2.6 Inicialização do cluster
Comece a inicializar o cluster e adicione o nó ao cluster. Todas as etapas a seguir só precisam ser executadas no nó mestre.
-
Crie um cluster
# 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址 [root@master ~]# kubeadm init --kubernetes-version=v1.17.4 --apiserver-advertise-address=192.168.79.100 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 # 下面是执行命令之后的运行结果 W0701 15:41:54.850536 9562 validation.go:28] Cannot validate kube-proxy config - no validator is available W0701 15:41:54.850592 9562 validation.go:28] Cannot validate kubelet config - no validator is available [init] Using Kubernetes version: v1.17.4 [preflight] Running pre-flight checks [preflight] Pulling images required for setting up a Kubernetes cluster [preflight] This might take a minute or two, depending on the speed of your internet connection [preflight] You can also perform this action in beforehand using 'kubeadm config images pull' [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Starting the kubelet [certs] Using certificateDir folder "/etc/kubernetes/pki" [certs] Generating "ca" certificate and key [certs] Generating "apiserver" certificate and key [certs] apiserver serving cert is signed for DNS names [master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.79.100] [certs] Generating "apiserver-kubelet-client" certificate and key [certs] Generating "front-proxy-ca" certificate and key [certs] Generating "front-proxy-client" certificate and key [certs] Generating "etcd/ca" certificate and key [certs] Generating "etcd/server" certificate and key [certs] etcd/server serving cert is signed for DNS names [master localhost] and IPs [192.168.79.100 127.0.0.1 ::1] [certs] Generating "etcd/peer" certificate and key [certs] etcd/peer serving cert is signed for DNS names [master localhost] and IPs [192.168.79.100 127.0.0.1 ::1] [certs] Generating "etcd/healthcheck-client" certificate and key [certs] Generating "apiserver-etcd-client" certificate and key [certs] Generating "sa" key and public key [kubeconfig] Using kubeconfig folder "/etc/kubernetes" [kubeconfig] Writing "admin.conf" kubeconfig file [kubeconfig] Writing "kubelet.conf" kubeconfig file [kubeconfig] Writing "controller-manager.conf" kubeconfig file [kubeconfig] Writing "scheduler.conf" kubeconfig file [control-plane] Using manifest folder "/etc/kubernetes/manifests" [control-plane] Creating static Pod manifest for "kube-apiserver" [control-plane] Creating static Pod manifest for "kube-controller-manager" W0701 15:42:21.370847 9562 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC" [control-plane] Creating static Pod manifest for "kube-scheduler" W0701 15:42:21.371810 9562 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC" [etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests" [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s [apiclient] All control plane components are healthy after 15.006014 seconds [upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace [kubelet] Creating a ConfigMap "kubelet-config-1.17" in namespace kube-system with the configuration for the kubelets in the cluster [upload-certs] Skipping phase. Please see --upload-certs [mark-control-plane] Marking the node master as control-plane by adding the label "node-role.kubernetes.io/master=''" [mark-control-plane] Marking the node master as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule] [bootstrap-token] Using token: l8o7vp.gbiatmb3iexxbppo [bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles [bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials [bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token [bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster [bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace [kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key [addons] Applied essential addon: CoreDNS [addons] Applied essential addon: kube-proxy # 显示集群下载安装完毕 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/ # 将任意多的worker nodes加入到根中 Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo \ --discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9
-
Crie os arquivos necessários:
sudo chown $(id -u):$(id -g) $HOME/.kube/config# 集群创建完毕之后显示下面这段提示, # 需要运行下面这段话 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 [root@master ~]# mkdir -p $HOME/.kube [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config # 此时查看node会发现这个集群只有一个master节点,需要将node节点加入到集群中 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 4m51s v1.17.4 [root@master ~]#
-
Para adicionar nós ao cluster, você precisa executar os seguintes comandos em node1 e node2
# 将任意多的worker nodes加入到根中 Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo \ --discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9 # 分别在node1和node2中运行这两句命令 [root@node1 ~]# kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo --discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9 [root@node2 ~]# kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo --discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9 #加入到集群之后,查看master机器中集群的节点信息:此时显示所有的node均已添加进来,但是还处于NotReady的状态,需要添加网络插件 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 8m9s v1.17.4 node1 NotReady <none> 14s v1.17.4 node2 NotReady <none> 31s v1.17.4 [root@master ~]#
-
Configurar plug-in de rede
# 下载网络插件到yml文件中 [root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 控制台的执行结果如下 --2022-07-01 15:53:27-- https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 正在解析主机 raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.109.133, ... 正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度:5750 (5.6K) [text/plain] 正在保存至: “kube-flannel.yml” 100%[=======================================================================================================================================================================>] 5,750 --.-K/s 用时 0s 2022-07-01 15:53:28 (18.3 MB/s) - 已保存 “kube-flannel.yml” [5750/5750]) # 将文件应用 apply命令 [root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 执行过程 podsecuritypolicy.policy/psp.flannel.unprivileged created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created serviceaccount/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created # 新开master的控制台窗口, 查看运行进度条情况 [root@master ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-9d85f5447-4r5vf 0/1 ContainerCreating 0 12m coredns-9d85f5447-r9k4g 0/1 ContainerCreating 0 12m etcd-master 1/1 Running 0 12m kube-apiserver-master 1/1 Running 0 12m kube-controller-manager-master 1/1 Running 0 12m kube-flannel-ds-298ct 1/1 Running 0 61s kube-flannel-ds-z6whb 1/1 Running 0 61s kube-flannel-ds-zl4mx 1/1 Running 0 61s kube-proxy-9m6xw 1/1 Running 0 12m kube-proxy-mhssb 1/1 Running 0 5m23s kube-proxy-mnn62 1/1 Running 0 5m6s kube-scheduler-master 1/1 Running 0 12m # 查看nodes的状态显示处于Ready状态 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 13m v1.17.4 node1 Ready <none> 5m46s v1.17.4 node2 Ready <none> 6m3s v1.17.4 # 所有组件处于running运行状态 [root@master ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-9d85f5447-4r5vf 1/1 Running 0 13m coredns-9d85f5447-r9k4g 1/1 Running 0 13m etcd-master 1/1 Running 0 13m kube-apiserver-master 1/1 Running 0 13m kube-controller-manager-master 1/1 Running 0 13m kube-flannel-ds-298ct 1/1 Running 0 111s kube-flannel-ds-z6whb 1/1 Running 0 111s kube-flannel-ds-zl4mx 1/1 Running 0 111s kube-proxy-9m6xw 1/1 Running 0 13m kube-proxy-mhssb 1/1 Running 0 6m13s kube-proxy-mnn62 1/1 Running 0 5m56s kube-scheduler-master 1/1 Running 0 13m [root@master ~]#
Neste ponto, todo o cluster foi configurado.
2.6 Teste de cluster
Implantar nginx
e testar o ambiente de cluster
# 1. 部署nginx 版本 1.14-alpine
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
deployment.apps/nginx created
# 2. 暴露端口
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
# 3. 查看服务状态 一个pod已经正在运行, service服务处于运行状态
[root@master ~]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-6867cdf567-ppmrj 1/1 Running 0 60s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18m
service/nginx NodePort 10.104.243.191 <none> 80:30134/TCP 43s
# 4. 获取集群的pod信息
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6867cdf567-ppmrj 1/1 Running 0 81s
[root@master ~]#
# 5. 根据暴露的端口,可以通过浏览器访问部署的nginx
# 访问地址为: 192.168.79.100:30134
# 访问结果如下图所示:成功访问到部署的nginx页面,部署成功