kubernetes-1.17.0集群搭建(上)

2023-12-15 20:03:45 浏览数 (3)

概述

  Kubernetes是一个可以移植、可扩展的开源平台,使用 声明式的配置 并依据配置信息自动地执行容器化应用程序的管理。在所有的容器编排工具中(类似的还有 docker swarm / mesos等),Kubernetes的生态系统更大、增长更快,有更多的支持、服务和工具可供用户选择。

Kubernetes的名字起源于希腊语,含义是 舵手、领航员、向导。Google于2014年将Brog系统开源为Kubernetes。Kubernetes构建在Google Brog 十五年运行大规模分布式系统的经验 (opens new window)基础之上,并结合了开源社区最好的想法和实践。

1. Kubernetes的功能

  容器是一个非常好的打包并运行应用程序的方式。在生产环境中,您需要管理容器化应用程序,并且确保其不停机地连续运行。例如:一个容器故障停机,另外一个容器需要立刻启动以替补停机的容器。类似的这种对容器的管理动作由系统来执行会更好更快速。

Kubernetes针对此类问题,提供了容器化编排解决方案,可以使你非常健壮地运行分布式系统。Kubernetes可以处理应用程序的伸缩、failover、部署模式等多种需求。例如,Kubernetes可以轻易地管理系统的金丝雀发布(灰度发布)。

2. Kubernetes提供的特性:

• 服务发现和负载均衡

Kubernetes 可以通过 DNS 名称或 IP 地址暴露容器的访问方式。并且可以在同组容器内分发负载以实现负载均衡

• 存储编排

Kubernetes可以自动挂载指定的存储系统,例如 local stroage/nfs/云存储等

• 自动发布和回滚

您可以在 Kubernetes 中声明您期望应用程序容器应该达到的状态,Kubernetes将以合适的速率调整容器的实际状态,并逐步达到最终期望的结果。

• 自愈

o 重启已经停机的容器

o 替换、kill 那些不满足自定义健康检查条件的容器

o 在容器就绪之前,避免调用者发现该容器

• 密钥及配置管理

Kubernetes可以存储和管理敏感信息(例如,密码、OAuth token、ssh密钥等)。您可以更新容器应用程序的密钥、配置等信息,而无需重新构建容器的镜像,在不合适的地方暴露密码信息

3. Kubernetes的边界

  Kubernetes不是一个传统意义的、保罗万象的 PaaS(Platform as a Service)系统。Kubernetes在容器层面工作,而不是硬件层面,它提供了与 PaaS 平台相似的通用特性,例如:部署、伸缩、负载均衡、日志、监控等。然而,Kubernetes并不是一个单一整体,这些特性都是可选、可插拔的。Kubernetes提供用于搭建开发平台的基础模块,同时为用户提供了不同模块的选择性和多样性。

Kubernetes:

• 不限制应用程序的类型。Kubernetes的目标是广泛支持不同类型的工作负载,包括:有状态、无状态、数据处理等类型的应用。只要应用可以在容器中运行,就能够非常好地在 Kubernetes 上运行

• 不部署源码、不编译或构建应用程序。持续集成、分发、部署(CI/CD)的工作流极大程度上取决于组织的文化、偏好以及技术要求。Kubernetes可以作为部署平台参与到 CI/CD 流程,但是不涉及镜像构建和分发的过程

• 不提供应用程序级别的服务,包括:中间件(例如,消息总线)、数据处理框架(例如,Spark)、数据库(例如,mysql)、缓存(例如,Redis),或者分布式存储(例如,Ceph)。此类组件可以在 Kubernetes 上运行,或者可以被运行在 Kubernetes 上的应用程序访问

• 不限定日志、监控、报警的解决方案。Kubernetes 提供一些样例展示如何与日志、监控、报警等组件集成,同时提供收集、导出监控度量(metrics)的一套机制。您可以根据自己的需要选择日志、监控、报警组件

• 不提供或者限定配置语言(例如,jsonnet)。Kubernetes提供一组声明式的 API,您可以按照自己的方式定义部署信息。

译者注:可选的有 helm/kustomize/kubectl/kubernetes dashboard/kuboard/octant/k9s 等

• 不提供或限定任何机器的配置、维护、管理或自愈的系统。

• 此外,Kubernetes不是一个纯粹意义上的容器编排系统。事实上,Kubernetes 消除了容器编排的需求。容器编排的技术定义是预定义流程的执行(先做A、再做B、然后做C)。与此相对应,Kubernetes构建了一系列相互独立、可预排的控制过程,以持续不断地将系统从当前状态调整到声明的目标状态。如何从 A 达到 C,并不重要。集中化的控制也就不需要了。这个设计思想使得Kubernetes使用更简单、更强大、稳健、反脆弱和可扩展。

1. 安装要求

部署Kubernetes集群的机器需要满足以下几个条件:

  • 两台及以上服务器
  • 操作系统:CentOS7.x-86_x64
  • 硬件配置:内存大于2G,CPU大于双核,硬盘大于50G
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区

2. 安装目标

  • 在所有节点上安装Docker和kubeadm
  • 部署Kubernetes Master
  • 部署容器网络插件
  • 部署 Kubernetes Node,将节点加入Kubernetes集群中
  • 部署Dashboard Web页面,可视化查看Kubernetes资源(这一部分将在下一节介绍)

3. 准备环境

环境准备阶段,以下配置需要在3个节点中都配置。

角色

IP

K8s-master

192.168.0.11

K8s-node1

192.168.0.12

Ks8-node2

192.168.0.13

代码语言:shell复制
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久关闭
setenforce 0  # 临时关闭

# 关闭swap
swapoff -a  # 临时关闭
vim /etc/fstab  # 永久关闭

# 设置主机名
hostnamectl set-hostname <hostname>

# 配置hosts
cat >> /etc/hosts << EOF
192.168.0.11 k8s-master
192.168.0.12 k8s-node1
192.168.0.13 k8s-node2
EOF

# 网络配置
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# 时间同步
yum install ntpdate -y
ntpdate time.windows.com


# 安装Docker、kubeadm、kubelet
# 注意:Kubernetes和Docker的版本有对应关系,本次使用的是kubernetes 1.17.0和Docker 18.06.1
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker --version
    Docker version 18.06.1-ce, build e68fc7a


# docker下载镜像,阿里云加速配置
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

#添加阿里云YUM软件源
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=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

# 安装kubeadm,kubelet和kubectl
# 由于版本更新频繁,这里指定版本号部署
yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
systemctl enable kubelet

4. 部署Kubernetes Master

只在192.168.0.11(k8s-master)执行

代码语言:shell复制
# 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
kubeadm init 
  --apiserver-advertise-address=192.168.0.11 
  --image-repository registry.aliyuncs.com/google_containers 
  --kubernetes-version v1.17.0 
  --service-cidr=10.96.0.0/12 
  --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

kubeadm join 192.168.0.11:6443 --token xpdvyf.5n78a09jjmff57wv 
    --discovery-token-ca-cert-hash sha256:4e8df33929f5ea52360e32187e0aacd5981ab3048d0e77ff991612cad65e16ff

# 使用kubectl工具、提示信息中出现需要手动执行的命令

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 nodes

5. 安装Pod网络插件(CNI)

安装pod网络插件在3个节点中都要配置。

代码语言:shell复制
# 确保你的网络能够访问到quay.io这个registery
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果Pod镜像下载失败,可以下载

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

然后修改里面内容

镜像地址quay.io/coreos/flannel:v0.13.1-rc2改成lizhenliang/flannel:v0.11.0-amd64

或者手动pull flannel

代码语言:shell复制
docker pull quay.io/coreos/flannel:v0.13.1-rc2
或者:
docker pull lizhenliang/flannel:v0.11.0-amd64

6. 加入Kubernetes Node

在192.168.0.12/13(Node)执行。

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:

代码语言:shell复制
kubeadm join 192.168.0.11:6443 --token xpdvyf.5n78a09jjmff57wv 
    --discovery-token-ca-cert-hash sha256:4e8df33929f5ea52360e32187e0aacd5981ab3048d0e77ff991612cad65e16ff

如果token过期、通过 kubedam 重新生成 token

kubeadm token create --print-join-command

8.测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行:

代码语言:shell复制
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc # 查看pod状态
[root@k8s-master server]#kubectl get pod,svc -owide
NAME                         READY   STATUS    RESTARTS   AGE    IP            NODE         NOMINATED NODE   READINESS GATES
pod/nginx-86c57db685-wfv9j   1/1     Running   0          101s   10.244.3.59   k8s-node1   <none>           <none>

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE    SELECTOR
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        727d   <none>
service/nginx        NodePort    10.96.130.130   <none>        80:45407/TCP   99s    app=nginx

访问地址:http://192.168.0.12:45407

结尾

  当完成以上这些步骤后,咱们就成功地安装和配置了 Kubernetes 集群。这个集群可以作为部署和管理容器化应用程序的基础架构。下一节将安装一个web管理界面Dashboard通过UI界面管理和部署容器化应用程序。

2023腾讯·技术创作特训营 第四期

0 人点赞