kubeadm部署k8s集群
1 容器编排工具介绍
容器编排三套解决方案
kubernetes
mesos+marathon
machine+swarn+compose
1.1 Docker提供的容器编排方案
docker compose 单主机编排,只能面向一个docker主机进行编排
docker swarm 编排多主机dokcer,整合一个资源池,而后docker compose只需面向资源池进行编排
docker machine 将一个主机迅速初始化为能符合加入docker swarm集群中的先决条件
1.2 kubernetes编排方案
1) k8s特性
自动装箱,自我修复,水平扩展,服务发现和负载均衡,自动发布和回滚,密钥和配置管理,存储编排,批量处理运行
2) k8s原理
用户把创建、启动容器的请求发动给master,master中的调度器去分析各nodes现有的可用资源状态,找一个最佳适配的,nodes本地的docker engine负责启动起来
3) Kubernetes组件
master:apiserver, controller-manager, scheduler
nodes: kubelet, kube-proxy, container
附加组件:etcd dashbord等
4) 逻辑构成:
- Pod
label(标签):key=value
pod分两类:
自主式的Pod
控制器管理的pod
- pod控制器
ReplicationController
ReplicaSet
Deployment
StatefulSet
DaemonSet
Job
CronJob
Horizontal Pod Autoscaler(HPA):自动伸缩pod,访问量猛增,随时扩大pod
- service: 管理同一类的pod信息,保存变更pod的信息,提供客户端访问
- CNI
flannel:网络配置
calico:网络配置、网络策略
canel
节点网络、集群网络、pod网络
2 安装前kubernees环境准备
2.1 搭建Kubernetes集群环境有三种方式
1) Minikube安装方式
Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。但是这种方式仅可用于学习和测试部署,不能用于生产环境。
https://kubernetes.io/docs/setup/minikube/
2) Kubeadm安装方式(本次基于该方式)
kubeadm是一个kubernetes官方提供的快速安装和初始化拥有最佳实践(best practice)的kubernetes集群的工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。目前kubeadm还处于beta 和alpha状态,不推荐用在生产环境,但是可以通过学习这种部署方法来体会一些官方推荐的kubernetes最佳实践的设计和思想。
kubeadm的目标是提供一个最小可用的可以通过Kubernetes一致性测试的集群,所以并不会安装任何除此之外的非必须的addon。kubeadm默认情况下并不会安装一个网络解决方案,所以用kubeadm安装完之后,需要自己来安装一个网络的插件。所以说,目前的kubeadm是不能用于生产环境的
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
3) 二进制包安装方式(生产部署的推荐方式)
从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群,这种方式符合企业生产环境标准的Kubernetes集群环境的安装,可用于生产方式部署。
https://github.com/kubernetes/kubernetes/releases
https://www.cnblogs.com/kevingrace/category/839227.html #参考
#本次安装环境
Kubernetes安装要求:
内核3.10+或4+
docker版本要小于17.03
OS:centos7.4
k8s:v1.20.1
Kubernetes 机器环境:
master, etcd:192.168.100.161
node1:192.168.100.162
node2:192.168.100.163
2.2 环境准备
#配置源、安装基本软件
cd /etc/yum.repos.d/
mkdir bak
mv *.repo bak/
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
yum repolist
yum -y install iproute net-tools lrzsz wget ntp* numactl psmisc vim bridge-util
cd
#时间同步
yum -y install chrony
systemctl enable chronyd.service && systemctl start chronyd.service
sed -i -e '/^server/s/^/#/' -e '1a server ntp.aliyun.com iburst' /etc/chrony.conf
systemctl restart chronyd.service
#关闭防火墙
systemctl stop firewalld.service && systemctl disable firewalld.service
#关闭selinux
setenforce 0
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
cat /etc/selinux/config | grep -w "SELINUX"
#关闭swap
swapoff -a
sed -i -r '/swap/s/^/#/' /etc/fstab
free -m
#设置时区
timedatectl set-timezone Asia/Shanghai
#配置hosts和修改主机名
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.161 master
192.168.100.162 node01
192.168.100.163 node02
#分别修改各主机名
hostnamectl set-hostname master
hostnamectl set-hostname node01
hostnamectl set-hostname node02
#修改内核参数
echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.conf
sysctl -p
#如果有如下报错:
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
解决方法:
安装bridge-util软件,加载bridge,br_netfilter模块
yum install -y bridge-utils.x86_64
modprobe bridge
modprobe br_netfilter
chmod +x /etc/rc.local
echo "modprobe bridge" >>/etc/rc.local
echo "modprobe br_netfilter" >>/etc/rc.local
2.3 配置源、安装docker和kubeadm
1) 配置docker源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2) 配置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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#添加好以后,查看一下
yum -y repolist
3) 安装docker和kubeadm
yum install -y docker-ce kubelet kubeadm kubectl
systemctl start docker && systemctl enable docker &&systemctl enable kubelet
#kubele设置成开机启动就行,不用现在启动
3 安装k8s (master端操作)
3.1 拉取镜像
[root@master ~]# kubeadm config images list #获取镜像版本
[root@hwsrv-693199 ~]# bash k8s_get_images.sh #替换下版本号,然后在访问外网的机器上执行
#!/bin/bash apiserver=k8s.gcr.io/kube-apiserver:v1.20.2 ctrl_manager=k8s.gcr.io/kube-controller-manager:v1.20.2 scheduler=k8s.gcr.io/kube-scheduler:v1.20.2 proxy=k8s.gcr.io/kube-proxy:v1.20.2 pause=k8s.gcr.io/pause:3.2 etcd=k8s.gcr.io/etcd:3.4.13-0 coredns=k8s.gcr.io/coredns:1.7.0 #下载镜像 for i in $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns;do docker pull $i;done #导出镜像 docker save -o k8s_images.tar.gz $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns chmod 755 k8s_images.tar.gz #删除镜像 for i in $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns;do docker rmi $i;done
[root@master ~]# docker load <k8s_images.tar.gz # 3个节点都需要load
3.2 初始化k8s
[root@master ~]# sed -i 's/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS="--fail-swap-on=false"/g' /etc/sysconfig/kubelet
[root@master ~]# kubeadm init --image-repository=k8s.gcr.io --kubernetes-version=v1.20.2 --apiserver-advertise-address=192.168.100.161 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
--image-repository:这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
--kubernetes-version:指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本
--apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。
--pod-network-cidr指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。
3.3 根据初始化的提示配置kubectl
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 ~]# kubectl get cs 查看集群状态
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health": "true"}
#遇到的问题:
注释掉/etc/kubernetes/manifests下的kube-controller-manager.yaml和kube-scheduler.yaml的- – port=0。
[root@master ~]# kubectl get nodes #查看节点信息
NAME STATUS ROLES AGE VERSION
master.magedu.com NotReady master 5m22s v1.13.4
3.4 安装pod网络
1) 安装Weave网络
export kubever=$(kubectl version | base64 | tr -d '\n')
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"
2) 查看
[root@master ~]# docker images #下载下面两个镜像很慢,预计20分钟
kubectl get pods -A
kubectl get nodes #状态改变了
#更多pod网络解决方案,请参考http://docs.kubernetes.org.cn/459.html#34pod
4 node节点加入k8s集群(nodes端操作)
1) 确保node节点上有以下镜像 ,把master上的拿过来就行了
#根据maser上 kubeadmin init执行结果的提示,在2台node上分别执行如下命令
kubeadm join 192.168.100.161:6443 --token 9zx9rt.t95m0qis1iyx85oi \
--discovery-token-ca-cert-hash sha256:1276e8641c573280371e87249f74d2b65bfcc60e76040ff88bd6c078b7cfaef7
2) master中的节点认证信息24小时会失效,可以用下面方法重新生成
#创建token
[root@master ~]# kubeadm token create
#创建新的sha
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
#加入集群
kubeadm join 172.16.20.102:6443 --token 【token】--discovery-token-ca-cert-hash sha256:【sha值】
5 基本使用
1、在master创建一个myapp的应用,副本数量为3
vim myapp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- containerPort: 80
name: http
kubectl apply -f myapp-deploy.yaml
可以通过以下一些命令查看应用的状态等信息
kubectl get deployment -w
kubectl get pods -o wide
2、service发布应用
kubectl expose deployment myapp-deploy --name=myapp-svc --port 80
kubectl get svc
3、发布应用,外部可以访问
kubectl edit svc myapp-svc
type: ClusterIP 将 ClusterIP 修改为NodePort
kubectl get svc
在集群外部访问http://192.168.100.167:32602/
4、扩容myapp应用
kubectl scale --replicas=5 deployment myapp-deploy
kubectl get pod -o wide
5、缩容myapp应用
kubectl scale --replicas=3 deployment myapp-deploy
kubectl get pod -o wide
6、滚动更新
#kubectl set image deployment [控制器名] [容器名]=ikubernetes/myapp:v2
kubectl get deployment -o wide
kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
7、查看滚动更新过程
# kubectl rollout status deployment myapp
8、更新完成后,查看镜像版本
# kubectl get deployment myapp -o wide
9、回滚
# kubectl rollout undo deployment myapp
10、删除应用
# kubectl delete deployment myapp
# kubectl delete svc myapp