简介
Pivotal公司的Matt Stine于2013年首次提出云原生(CloudNative)的概念;而Pivotal最新官网对云原生概括为4个要点:DevOps + 持续交付 + 微服务 + 容器。
CNCF(云原生计算基金会) 定义是 能够在现代动态环境(如公共、私有和混合云)中构建和运行可伸缩的应用程序。容器、服务网格、微服务、不可变的基础设施和声明性 API 就是这种方法的例证。
CNCF成立后备受推崇,越来越多的项目和成员加入进来。截至目前,CNCF聚集的会员超过15万,项目贡献者超过8.5万人。
目前,已经有10个项目从孵化到成熟,最终进入到毕业阶段。这10个项目分别是Kubernetes、Prometheus、Envoy、CoreDNS、containerd、TUF、Jaeger、Fluentd、Vitess,还有刚刚毕业的项目Helm。
🚀 Kubernetes,大家再熟悉不过了,它是CNCF的第一个项目,作为开源容器编排系统,主要应用与自动化容器化应用程序的部署、扩展和管理。它已经是事实上的容器编排标准。云原生就从Kubernetes开始启航。
关于基础定义概念 网络较多 请自行搜索文档,文章不再赘述, 直接上干货
方法 / 步骤
部署环境 CentOS7.9 / kubernetes 1.25.0 / docker 20.10.17
🏭一: 前置环境设置 / 安装
1.1 : 系统前置配置
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭并修改文件内容
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# 永久关闭SELINUX
vi /etc/selinux/config
SELINUX=disabled
# 关闭交换内存
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 修改内核参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system
modprobe br_netfilter
lsmod | grep br_netfilter
# 时间同步: 启动服务 && 设置服务开机自启 && 使用date命令验证时间
systemctl start chronyd && systemctl enable chronyd && date
1.2 : 安装Docker
yum install yum-utils
# 查看docker 列表
yum list docker-ce --showduplicates | sort -r
# 安装yum 工具
yum install -y yum-utils
# 切换yum仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker指定版本 (推荐) 笔者centOS 7.9 安装 docker-ce-17.12.1.ce
# yum -y install docker-ce-17.12.1.ce
# 安装docker指定版本 (推荐) 笔者centOS 7.9 安装 docker-ce-19.03.15
yum -y install docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io
# 设置镜像加速
sudo mkdir -p /etc/docker
# docker的cgroup驱动程序默认设置为system。默认情况下Kubernetes cgroup为systemd
# 镜像加速
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://u2v98cer.mirror.aliyuncs.com",
"https://0b27f0a81a00f3560fbdc00ddd2f99e0.mirror.swr.myhuaweicloud.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 设置开机启动并且启动docker
systemctl enable docker && systemctl start docker
🚄 二:安装kubernetes组件
2.1 : 配置kubernetes镜像源
# 由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 编辑/etc/yum.repos.d/kubernetes.repo,直接写入下面的配置
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
2.2 安装K8S三剑客 kubelet kubeadm kubectl
#首先查询组件是否安装过组件
yum list installed | grep kube
# 由于版本更新频繁,这里指定版本号部署安装
yum install --setopt=obsoletes=0 kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15 -y
# 配置kubelet的cgroup
# 编辑/etc/sysconfig/kubelet, 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 设置开机自动启动
systemctl enable kubelet
# 启动K8S
systemctl start kubelet
# 重启K8S
systemctl restart kubelet
三:集群配置
3.1 准备集群镜像源
# 查看所需镜像
kubeadm config images list
# 下载镜像
# 此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案(注意这里版本号换成自己版本适配的版本号)
images=(
kube-apiserver:v1.20.15
kube-controller-manager:v1.20.15
kube-scheduler:v1.20.15
kube-proxy:v1.20.15
pause:3.2
etcd:3.4.13-0
coredns:1.7.0
)
for imageName in ${images[@]};do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
3.2 查看docker镜像
docker images
3.3 集群初始化
3.3.1 master节点启动集群 (只需要在master节点执行)
下面的操作只需要在master节点上执行即可
# 创建集群
# 下面是启动的一些配置,
# 需要修改--apiserver-advertise-address 这个地址为你的master节点的ip地址
# kubernetes-version 是你的k8s版本
kubeadm init \
--apiserver-advertise-address=192.168.11.235 \
--kubernetes-version=v1.20.15 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 运行成功后 会在/etc/kubernetes/文件夹下面多
# scheduler.conf kubelet.conf controller-manager.conf admin.conf 这几个文件
# 创建必要文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# K8S在kubeadm init以后查询kubeadm join
kubeadm token create --print-join-command
# 重新生成token
kubeadm token create
3.3.2 node节点加入集群 (只需要在node节点执行)
下面的操作只需要在node节点上执行即可
将集群启动时的命令复制过来到node节点中执行
kubeadm join 192.168.11.235:6443 --token s5ltc4.h9qu8jpfoqw2cjpb \
--discovery-token-ca-cert-hash sha256:697f8b35d6e00acd1048ef6ece637537055f4e82c707de57b3288248bf1b6453
3.4 master查看节点信息
kubectl get nodes
看到为NotReady状态,这是为什么呢?这是因为它的网络插件没有安装, node节点需要安装网络插件才能保证所有的pod在一个局域网内通信
3.5 网络插件安装
node节点需要安装flannel网络插件才能保证所有的pod在一个局域网内通信,直接使用yum安装即可,
*kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择flannel
注意是所有node节点都需要安装, 先在master节点操作,下载flannel配置文件*
cd /usr/local/
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 使用配置文件启动fannel
kubectl apply -f kube-flannel.yml
# 查看K8S系统服务是否都启动成功(如果有报错可以查看文章末尾是否有解决方案)
kubectl get pods -n kube-system
3.6 集群测试
已经将k8s集群安装配置完毕 下面在Kubernetes集群中部署一个Nginx程序,测试下集群是否正常工作。
3.6.1 创建一个nginx服务
kubectl create deployment nginx --image=nginx:1.14-alpine
# 暴露端口
kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
# 查看服务
kubectl get pod,svc
怎么访问呢?可以看到nginx暴露的端口有两个80 和 30692这两个那个是对外的呢?32351 是对外的
访问格式:http://maser节点ip:暴露的端口
http://192.168.11.235:30692