目录
前言:
一、Kubernetes简介与架构
1. Kubernetes简介
2. kubernetes设计架构
二、实验环境搭建
1、集群环境初始化
2、所有集群节点安装kubeadm
3、拉取集群所需镜像
3、集群初始化
4、安装flannel网络插件
5、扩容节点
6、设置kubectl命令补齐
官网:Kubernetes 文档 | Kubernetes
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。
kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用(就像canary deployments)。
Kubernetes的好处:
隐藏资源管理和错误处理,用户仅需要关注应用的开发。
服务高可用、高可靠。
可将负载运行在由成千上万的机器联合而成的集群中。
Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。
Kubernetes主要由以下几个核心组件组成:
- etcd保存了整个集群的状态;
- apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
- controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
- kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
- Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
- kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;
除了核心组件,还有一些推荐的Add-ons:
- kube-dns负责为整个集群提供DNS服务
- Ingress Controller为服务提供外网入口
- Heapster提供资源监控
- Dashboard提供GUI
- Federation提供跨可用区的集群
- Fluentd-elasticsearch提供集群日志采集、存储与查询
Kubernetes设计理念和功能其实就是一个类似Linux的分层架构
- 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
- 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
- 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
- 接口层:kubectl命令行工具、客户端SDK以及集群联邦
- 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
- Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
- Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
官网:安装 kubeadm | Kubernetes
主机名 | ip | 角色 |
k8s1 | 192.168.56.11 | reg.westos.org,harbor仓库 |
k8s2 | 192.168.56.12 | master,k8s集群控制节点 |
k8s3 | 192.168.56.13 | node,k8s集群工作节点 |
k8s4 | 192.168.56.14 | node,k8s集群工作节点 |
所有节点禁用selinux和防火墙
所有节点同步时间和解析
所有节点安装docker-ce
所有节点禁用swap,注意注释掉/etc/fstab文件中的定义
k8s1节点作为harbor仓库,请按一下步骤部署
[root@k8s1 ~]# cd /etc/yum.repos.d/
[root@k8s1 yum.repos.d]# vim docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/
gpgcheck=0
[update]
name=centos
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7/extras/x86_64/
gpgcheck=0
安装docker-ce
[root@k8s1 yum.repos.d]# yum install -y docker-ce
启动服务
[root@k8s1 ~]# systemctl enable --now docker
[root@k8s1 ~]# docker info
激活内核选项
[root@k8s1 ~]# vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
[root@k8s1 ~]# sysctl --system
[root@k8s1 ~]# systemctl restart docker
升级软件包
[root@k8s1 ~]# yum install -y openssl11-1.1.1k-4.el7.x86_64.rpm openssl11-libs-1.1.1k-4.el7.x86_64.rpm
添加域名解析
[root@k8s1 ~]# vim /etc/hosts
...
192.168.56.11 k8s1 reg.westos.org
[root@k8s1 ~]# mkdir certs
[root@k8s1 ~]# openssl11 req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -addext "subjectAltName = DNS:reg.westos.org" -x509 -days 365 -out certs/westos.org.crt
域名保持一致
[root@k8s1 ~]# docker run -d -p 443:443 --restart=always --name registry -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key registry
部署客户端证书,不然会报错
[root@k8s1 ~]# docker tag nginx:latest reg.westos.org/nginx:latest
[root@k8s1 ~]# docker push reg.westos.org/nginx:latest The push refers to repository [reg.westos.org/nginx]
Get "https://reg.westos.org/v2/": x509: certificate signed by unknown authority
[root@k8s1 ~]# mkdir -p /etc/docker/certs.d/reg.westos.org/
[root@k8s1 ~]# cp /root/certs/westos.org.crt /etc/docker/certs.d/reg.westos.org/ca.crt
验证
[root@k8s1 ~]# docker push reg.westos.org/nginx:latest
[root@k8s1 reg.westos.org]# curl -k https://reg.westos.org/v2/_catalog
{"repositories":["nginx"]}
[root@k8s1 ~]# yum install -y httpd-tools
[root@k8s1 ~]# mkdir auth
[root@k8s1 ~]# htpasswd -Bc auth/htpasswd admin
New password:
Re-type new password:
Adding password for user admin
第二次添加不要加“-c”选项,不然会覆盖
[root@k8s1 ~]# htpasswd -B auth/htpasswd wxh
New password:
Re-type new password:
Adding password for user wxh
[root@k8s1 ~]# cat auth/htpasswd
admin:$2y$05$Wm2LHttPY5a6i2KMG0fShe92d/PjnaBbGitiClcE3wqHmwO8dIDFm
wxh:$2y$05$9rE9CXyZ1fdcMammhh7f6.soDHgKdSsi0DXBgkRW5sKRw5sEJo1lK
删除registry,重建
[root@k8s1 ~]# docker rm -f registry
[root@k8s1 ~]# docker run -d -p 443:443 --restart=always --name registry -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key -v /root/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
登录仓库,不然无法上传下载
[root@k8s1 ~]# docker login reg.westos.org
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@k8s1 ~]# cat .docker/config.json
验证
[root@k8s1 ~]# docker tag busybox:latest reg.westos.org/busybox:latest
[root@k8s1 ~]# docker push reg.westos.org/busybox:latest
[root@k8s1 ~]# curl -k https://reg.westos.org/v2/_catalog -u admin:westos
{"repositories":["busybox","nginx"]}
登出
[root@k8s1 ~]# docker logout reg.westos.org
[root@k8s1~]# tar zxf harbor-offline-installer-v2.5.0.tgz
[root@k8s1~]# cd harbor/
[root@k8s1harbor]# cp harbor.yml.tmpl harbor.yml
[root@k8s1harbor]# vim harbor.yml
hostname: reg.westos.org
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /data/certs/westos.org.crt
private_key: /data/certs/westos.org.key
harbor_admin_password: westos
拷贝证书
[root@k8s1~ ]# mkdir /data
[root@k8s1~ ]# cp -r certs /data
部署docker-compose
[root@k8s1~]# mv docker-compose-linux-x86_64-v2.5.0 /usr/local/bin/docker-compose
[root@k8s1~]# chmod +x /usr/local/bin/docker-compose
部署harbor
[root@k8s1harbor]# ./install.sh
使用浏览器登录仓库 用户名:admin 密码是上面配置文件设置的westos
https://192.168.56.11
上传镜像,首先需要执行
docker login reg.westos.org
[root@k8s1~]# docker tag busybox:latest reg.westos.org/library/busybox:latest
[root@k8s1~]# docker tag nginx:latest reg.westos.org/library/nginx:latest
[root@k8s1~]# docker push reg.westos.org/library/nginx:latest
[root@k8s1 ~]# docker push reg.westos.org/library/busybox:latest
下面是k8s集群配置
所有k8s集群节点执行以下步骤
[root@k8s2 ~]# swapoff -a
[root@k8s2 ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Feb 19 17:38:40 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=ddb06c77-c9da-4e92-afd7-53cd76e6a94a /boot xfs defaults 0 0
#/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media iso9660 defaults 0 0
修改内核参数
[root@k8s2 ~]# cd /etc/sysctl.d/
[root@k8s2 sysctl.d]# vim docker.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
[root@k8s2 ~]# sysctl --system
[root@k8s2 yum.repos.d]# vim docker.repo
[docker]
name=docker-ce
baseurl=Index of /docker-ce/linux/centos/7/x86_64/stable/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
gpgcheck=0
[centos]
name=extras
baseurl=Index of /centos/7/extras/x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
gpgcheck=0
[root@k8s2 ~]# yum install -y docker-ce
[root@k8s2 ~]# systemctl enable --now docker
[root@k8s2 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://reg.westos.org"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
[root@k8s2 ~]# systemctl restart docker
所有节点同步docker配置,以及拷贝harbor仓库的证书
[root@k8s1 ~]# cd /etc/docker/
[root@k8s1 docker]# ls
certs.d
[root@k8s1 docker]# scp -r certs.d/ k8s2:/etc/docker/
确保所有k8s节点可以从私有仓库下载镜像
[root@k8s2 docker]# docker pull nginx
[root@k8s2 yum.repos.d]# vim k8s.repo
[kubernetes]
name=Kubernetes
baseurl=Index of /kubernetes/yum/repos/kubernetes-el7-x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
gpgcheck=0
[root@k8s2 ~]# yum install -y kubelet-1.23.17-0 kubeadm-1.23.17-0 kubectl-1.23.17-0
[root@k8s2 ~]# systemctl enable --now kubelet
[root@k8s2 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
登录仓库
[root@k8s2 ~]# docker login reg.westos.org
Username: admin
Password:
先在harbor仓库上新建一个项目
上传镜像
[root@k8s2 ~]# docker images |grep google_containers | awk '{print $1":"$2}' | awk -F/ '{system("docker tag "$0" reg.westos.org/k8s/"$3"")}'
[root@k8s2 ~]# docker images |grep k8s | awk '{system("docker push "$1":"$2"")}'
[root@k8s2 ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/k8s --kubernetes-version v1.23.17
设置环境变量
[root@k8s2 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
注意没有设置变量会有以下报错
写入环境变量文件,确保重启后依然生效
[root@k8s2 ~]# vim .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
export KUBECONFIG=/etc/kubernetes/admin.conf
查看集群状态
[root@k8s2 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s2 NotReady control-plane,master 74s v1.23.17
当前节点还没有就绪,是因为没有安装网路插件,pod还没运行
[root@k8s2 ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7b56f6bc55-b495q 0/1 Pending 0 79s
kube-system coredns-7b56f6bc55-ch2ts 0/1 Pending 0 79s
kube-system etcd-k8s2 1/1 Running 0 92s
kube-system kube-apiserver-k8s2 1/1 Running 0 92s
kube-system kube-controller-manager-k8s2 1/1 Running 0 92s
kube-system kube-proxy-7ckfn 1/1 Running 0 79s
kube-system kube-scheduler-k8s2 1/1 Running 0 92s
下载flannel网络插件
[root@k8s2 ~]# yum install -y wget
[root@k8s2 ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
修改镜像位置
[root@k8s2 ~]# vim kube-flannel.yml
新建项目仓库
下载镜像
[root@k8s1 docker]# docker pull docker.io/flannel/flannel:v0.21.2
[root@k8s1 docker]# docker pull docker.io/flannel/flannel-cni-plugin:v1.1.2
上传镜像
[root@k8s1 docker]# docker images |grep flannel | awk '{print $1":"$2}' | awk '{system("docker tag "$0" reg.westos.org/"$0"")}'
[root@k8s1 docker]# docker push reg.westos.org/flannel/flannel:v0.21.2
[root@k8s1 docker]# docker push reg.westos.org/flannel/flannel-cni-plugin:v1.1.2
确保镜像上传成功
部署网络插件
[root@k8s2 ~]# kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
[root@k8s2 ~]# kubectl -n kube-flannel get pod
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-6gnh4 1/1 Running 0 11s
[root@k8s2 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s2 Ready control-plane,master 14m v1.23.17
[root@k8s2 ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-6gnh4 1/1 Running 0 20s
kube-system coredns-7b56f6bc55-b495q 1/1 Running 0 14m
kube-system coredns-7b56f6bc55-ch2ts 1/1 Running 0 14m
kube-system etcd-k8s2 1/1 Running 0 14m
kube-system kube-apiserver-k8s2 1/1 Running 0 14m
kube-system kube-controller-manager-k8s2 1/1 Running 0 14m
kube-system kube-proxy-7ckfn 1/1 Running 0 14m
kube-system kube-scheduler-k8s2 1/1 Running 0 14m
[root@k8s3 ~]# kubeadm join 192.168.56.12:6443 --token u9a137.tll3mwnlqgc74gll \
> --discovery-token-ca-cert-hash sha256:01198c9ecacf6d15068debb4cd4fddf8ac0fa1dba65c3b049c5dc1761c355e02
[root@k8s4 ~]# kubeadm join 192.168.56.12:6443 --token u9a137.tll3mwnlqgc74gll \
> --discovery-token-ca-cert-hash sha256:01198c9ecacf6d15068debb4cd4fddf8ac0fa1dba65c3b049c5dc1761c355e02
[root@k8s2 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s2 Ready control-plane,master 16m v1.23.17
k8s3 Ready
k8s4 Ready
[root@k8s2 ~]# yum install -y bash-completion
[root@k8s2 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s2 ~]# source ~/.bashrc
至此集群环境部署完毕,下章节正式开始k8s之旅!
上一篇:JAVA并发编程之锁
下一篇: 高一数学竞赛活动方案