minikube演示kubernetes应用部署与水平伸缩
新建虚机
工具:VMWare WorkStation 16
虚机镜像:CentOS-7-x86_64-Minimal-2009.iso
安装kubectl/kubeadm/kubelet
参考文章:https://www.cnblogs.com/zhaopengcheng/p/13582933.html
1 yum 源修改为国内
// 备份本地yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak
// 获取阿里yum源配置
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
// 或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
// 更新catch
yum clean all # 清除系统所有的yum缓存
yum makecache # 生成yum缓存
// 查看
yum -y update
// 调整时区为上海
timedatectl set-timezone Asia/Shanghai
2 使用本地软件包管理软件安装 kubectl 二进制文件
$ 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
若安装的时候密钥出问题,可以不配置密钥
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
EOF
3 查看可安装的版本
[root@localhost ~]# yum list kubectl –showduplicates
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* 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
kubernetes | 1.4 kB 00:00:00
updates | 2.9 kB 00:00:00
kubernetes/primary | 107 kB 00:00:00
kubernetes 785/785
可安装的软件包
kubectl.x86_64 1.23.5-0 kubernetes
4 yum方式安装kubectl
开始安装 kubelet kubeadm kubectl
$ yum install -y kubelet kubeadm kubectl
设置开机启动
$ systemctl enable kubelet && systemctl start kubelet
设置路由策略
lsmod | grep br_netfilter
使桥接流量对iptables可见
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
关闭swap
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
sudo swapoff -a
验证是否生效,均返回 1 即正确
sysctl -n net.bridge.bridge-nf-call-iptables
sysctl -n net.bridge.bridge-nf-call-ip6tables
echo "1" >/proc/sys/net/ipv4/ip_forward
5 防火墙相关
关闭防火墙
sudo systemctl stop firewalld.service #停止firewall
sudo systemctl disable firewalld.service #禁止firewall开机启动
sudo firewall-cmd --state #查看防火墙状态
禁用SELINUX
sudo setenforce 0
sudo vi /etc/selinux/config
#SELINUX修改为disabled
SELINUX=disabled
5 升级内核为 5.4 版本
更新yum源
yum -y update
获取源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
安装,装完成后检查 /boot/grub2/grub.cfg中对应内核menuentry中是否包含 initrd16 配置,如果没有,再安装一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
查看系统的全部内核
sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
[root@localhost ~]# sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.4.186-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.59.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-544699b73b79426492ac4e2497d05751) 7 (Core)
设置开机从新内核启动
grub2-set-default 0
生成grub配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.4.186-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-5.4.186-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.59.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.59.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-544699b73b79426492ac4e2497d05751
Found initrd image: /boot/initramfs-0-rescue-544699b73b79426492ac4e2497d05751.img
done
重启使配置有效
reboot
查看正在使用的内核
uname -r
[root@localhost ~]# uname -r
5.4.186-1.el7.elrepo.x86_64
6 安装 docker-ce,国内阿里仓库安装
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
$ sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装最新版本的 Docker Engine-Community 和 containerd
$ sudo yum install docker-ce docker-ce-cli containerd.io
将普通用户可以执行docker命令
创建docker 用户组
sudo groupadd docker
普通用户加入docker用户组
sudo usermod -aG docker ${USER}
启动docker
sudo systemctl restart docker
## Create /etc/docker
mkdir /etc/docker
# Set up the Docker daemon
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart Docker
systemctl daemon-reload
systemctl restart docker
# 开机启动docker
systemctl enable docker
7 查看kubeadm、kubectl、kubelet 版本命令
[root@localhost ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.5", GitCommit:"c285e781331a3785a7f436042c65c5641ce8a9e9", GitTreeState:"clean", BuildDate:"2022-03-16T15:57:37Z", GoVersion:"go1.17.8", Compiler:"gc", Platform:"linux/amd64"}
[root@localhost ~]# kubectl version --client
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.5", GitCommit:"c285e781331a3785a7f436042c65c5641ce8a9e9", GitTreeState:"clean", BuildDate:"2022-03-16T15:58:47Z", GoVersion:"go1.17.8", Compiler:"gc", Platform:"linux/amd64"}
[root@localhost ~]# kubelet --version
Kubernetes v1.23.5
8 初始化master集群
kubeadm init --kubernetes-version=1.23.5 \
--apiserver-advertise-address=172.25.6.126 \
--ignore-preflight-errors=all \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
安装Minikube
参考官方文档:minikube start | minikube (k8s.io)
1 安装
[root@localhost ~]# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 69.2M 100 69.2M 0 0 3205k 0 0:00:22 0:00:22 --:--:-- 3856k
[root@localhost ~]# sudo install minikube-linux-amd64 /usr/local/bin/minikube
2 启动
[huoxinli@localhost root]$ minikube start --driver=docker
[huoxinli@localhost root]$ minikube start --driver=docker
* Centos 7.9.2009 上的 minikube v1.25.2
* 根据用户配置使用 docker 驱动程序
* Starting control plane node minikube in cluster minikube
* Pulling base image ...
* Downloading Kubernetes v1.23.3 preload ...
> preloaded-images-k8s-v17-v1...: 505.68 MiB / 505.68 MiB 100.00% 3.40 MiB
> index.docker.io/kicbase/sta...: 379.06 MiB / 379.06 MiB 100.00% 129.47 K
! minikube was unable to download gcr.io/k8s-minikube/kicbase:v0.0.30, but successfully downloaded docker.io/kicbase/stable:v0.0.30 as a fallback image
* Creating docker container (CPUs=2, Memory=2200MB) ...
! This container is having trouble accessing https://k8s.gcr.io
* To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
* 正在 Docker 20.10.12 中准备 Kubernetes v1.23.3…
- kubelet.housekeeping-interval=5m
- Generating certificates and keys ...
- Booting up control plane ...
- Configuring RBAC rules ...
* Verifying Kubernetes components...
- Using image gcr.io/k8s-minikube/storage-provisioner:v5
* Enabled addons: default-storageclass, storage-provisioner
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
应用部署与升级扩容等功能实践
1 查看集群、节点信息及创建namespace实现资源隔离
// 查看集群信息
$ kubectl cluster-info
// 获取节点信息
$ kubectl get nodes
// 查看hostname
$ hostname
// 创建namespace
$ kubectl create namespace cindy
// 查看namespace
$ kubectl get namespaces
2 部署应用 升级与扩容
部署应用
// 下载一个yaml文件用于部署
[huoxinli@control-plane ~]$ curl -LO https://k8s.io/examples/application/deployment.yaml
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 178 100 178 0 0 65 0 0:00:02 0:00:02 --:--:-- 65
100 371 100 371 0 0 72 0 0:00:05 0:00:05 --:--:-- 279
// 查看
[huoxinli@control-plane ~]$ cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
// 部署 apply一个deployment
[huoxinli@control-plane ~]$ kubectl apply -f deployment.yaml
deployment.apps/nginx-deployment created
// 在指定的namespace中部署应用
[huoxinli@control-plane ~]$ kubectl apply -f deployment.yaml -n cindy
// 查看deployments
[huoxinli@control-plane ~]$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 44s
// 查看详情
[huoxinli@control-plane ~]$ kubectl describe deployment nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Thu, 24 Mar 2022 14:54:38 +0800
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.14.2
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-9456bbbf9 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 100s deployment-controller Scaled up replica set nginx-deployment-9456bbbf9 to 2
升级应用
// 升级nginx-deployment
// 1 先下载对应的update的yaml文件
[huoxinli@control-plane ~]$ curl -LO https://k8s.io/examples/application/deployment-update.yaml
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 178 100 178 0 0 115 0 0:00:01 0:00:01 --:--:-- 115
100 368 100 368 0 0 88 0 0:00:04 0:00:04 --:--:-- 163
// 2 查看deployment-update.yaml文件的情况
[huoxinli@control-plane ~]$ cat deployment-update.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.1 # Update the version of nginx from 1.14.2 to 1.16.1
ports:
- containerPort: 80
// 3 apply这个升级版本的deployment
[huoxinli@control-plane ~]$ kubectl apply -f deployment-update.yaml
deployment.apps/nginx-deployment configured
// 4 查看详情
[huoxinli@control-plane ~]$ kubectl describe deployment nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Thu, 24 Mar 2022 14:54:38 +0800
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 2
Selector: app=nginx
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.16.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-ff6655784 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 4m53s deployment-controller Scaled up replica set nginx-deployment-9456bbbf9 to 2
Normal ScalingReplicaSet 66s deployment-controller Scaled up replica set nginx-deployment-ff6655784 to 1
Normal ScalingReplicaSet 23s deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 1
Normal ScalingReplicaSet 23s deployment-controller Scaled up replica set nginx-deployment-ff6655784 to 2
Normal ScalingReplicaSet 21s deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 0
升级与回滚命令 (二)
需要已知镜像版本或者已知镜像
kubectl set image deployment.apps/nginx-deployment nginx=nginx:1.16.1
kubectl set image deployment.apps/nginx-deployment nginx=nginx:1.14.2
kubectl rollout undo deployment nginx-deployment
记录版本以便查看版本及回退到指定版本
// 部署应用时记录版本
$ kubectl apply -f deployment.yaml --record
// 查看历史版本
$ kubectl rollout history deployment nginx-deployment
// 回退到指定版本
$ kubectl rollout undo deployment nginx-deployment --to-revision=3
// 查看deployment的状态
kubectl rollout status deployment nginx-deployment
扩容
// 扩容
// 1 扩容 niginx-deployment
[huoxinli@control-plane ~]$ curl -LO https://k8s.io/examples/application/deployment-scale.yaml
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 178 100 178 0 0 77 0 0:00:02 0:00:02 --:--:-- 77
100 350 100 350 0 0 96 0 0:00:03 0:00:03 --:--:-- 664
// 2 查看
[huoxinli@control-plane ~]$ cat deployment-scale.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 4 # Update the replicas from 2 to 4
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
// 3 apply 扩容的deployment
[huoxinli@control-plane ~]$ kubectl apply -f deployment-scale.yaml
deployment.apps/nginx-deployment configured
// 4 查看详情
[huoxinli@control-plane ~]$ kubectl describe deployment nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Thu, 24 Mar 2022 14:54:38 +0800
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 3
Selector: app=nginx
Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.14.2
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-9456bbbf9 (4/4 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 4m34s deployment-controller Scaled up replica set nginx-deployment-ff6655784 to 1
Normal ScalingReplicaSet 3m51s deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 1
Normal ScalingReplicaSet 3m51s deployment-controller Scaled up replica set nginx-deployment-ff6655784 to 2
Normal ScalingReplicaSet 3m49s deployment-controller Scaled down replica set nginx-deployment-9456bbbf9 to 0
Normal ScalingReplicaSet 40s deployment-controller Scaled up replica set nginx-deployment-9456bbbf9 to 1
Normal ScalingReplicaSet 40s deployment-controller Scaled up replica set nginx-deployment-ff6655784 to 4
Normal ScalingReplicaSet 40s deployment-controller Scaled down replica set nginx-deployment-ff6655784 to 3
Normal ScalingReplicaSet 39s (x2 over 8m21s) deployment-controller Scaled up replica set nginx-deployment-9456bbbf9 to 2
Normal ScalingReplicaSet 32s deployment-controller Scaled down replica set nginx-deployment-ff6655784 to 2
Normal ScalingReplicaSet 29s (x4 over 32s) deployment-controller (combined from similar events): Scaled down replica set nginx-deployment-ff6655784 to 0
水平伸缩方式(二)
kubectl scale deployment.apps/nginx-deployment --replicas=2
kubectl scale deployment.apps/nginx-deployment --replicas=4
期间 观察deployments变化:
$ kubectk get --watch deployment
删除应用
[huoxinli@control-plane ~]$ kubectl delete deployments nginx-deployment
deployment.apps "nginx-deployment" deleted
[huoxinli@control-plane ~]$ kubectl get deployments
No resources found in default namespace.