简介
Kubernetes 简称 k8s。是用于自动部署,扩展和管理容器化应用程序的开源系统。
中文官网:https://kubernetes.io/zh/
中文社区:https://www.kubernetes.org.cn/
官方文档:https://kubernetes.io/zh/docs/home/
社区文档:http://docs.kubernetes.org.cn/
virtualbox+vagrant安装请查看
https://blog.csdn.net/weixin_44371237/article/details/121535927
离线下载virtualbox的centos系统包
centos官网下载vagrant镜像http://cloud.centos.org/centos/7/vagrant/x86_64/images/CentOS-7.box
将.box 文件添加到 vagrant 中,在cmd输入 vagrant box add d:\CentOS-7.box --name centos-7
进入你要启动的Vagrantfile盘,创建如下文件 Vagrantfile
Vagrant.configure("2") do |config|
(1..3).each do |i|
config.vm.define "k8s-#{i}" do |node|
# 设置虚拟机的Box
node.vm.box = "centos-7"
# 设置虚拟机的主机名
node.vm.hostname="k8s-#{i}"
# 设置虚拟机的IP
node.vm.network "private_network", ip: "192.168.56.#{100+i}", netmask: "255.255.255.0"
# 设置主机与虚拟机的共享目录
# node.vm.synced_folder "~/Documents/vagrant/share", "/home/vagrant/share"
# VirtaulBox相关配置
node.vm.provider "virtualbox" do |v|
# 设置虚拟机的名称
v.name = "k8s-#{i}"
# 设置虚拟机的内存大小
v.memory = 4096
# 设置虚拟机的CPU个数
v.cpus = 4
end
end
end
end
启动
在Vagrantfile目录输入 vagrant up
开启 root 的密码访问权限,以便用SecureCRT访问
vi /etc/ssh/sshd_config
按i进入输入模式,修改为 PasswordAuthentication yes ,按esc,输入:wq 退出
重启服务 service sshd restart
设置网络
网卡1是k8s用的网卡,连接方式改为NAT网络,并重新生成MAC地址
重新启动,ping 相互看能否ping 通
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
查看 cat /etc/selinux/config 都已设置成功
关闭swap(关闭内存交换)
临时
swapoff -a
永久
sed -ri 's/.swap./#&/' /etc/fstab
验证,swap 必须为 0
free -g
查看,都已设置成功(注释掉以下红框那句)
cat /etc/fstab
时间同步
yum install ntpdate -y
ntpdate time1.aliyun.com
添加主机名与IP对应关系
查看主机名 hostname
查看ip addr
批量编辑所有虚拟主机的地址 vi /etc/hosts,按i键进入插入模式,复制如下代码黏贴进去
10.0.2.9 k8s-1
10.0.2.10 k8s-2
10.0.2.11 k8s-3
按:wq
将桥接的IPv4流量传递到iptables的链,更精确统计流量
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
EOF
sysctl --system 查看应用成功
备份主机
后期有问题,可以停机 恢复备份
安装docker
docker 官方文档 https://docs.docker.com/engine/install/
Docker的镜像称为image,容器称为container。对于Docker来说,image是静态的,类似于操作系统快照,而container则是动态的,是image的运行实例。
有了镜像才能创建容器,如果数据在容器里,删除容器会丢失数据,数据持久化请看数据卷
安装gcc
yum -y install gcc
yum -y install gcc-c++
卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装所需软件
sudo yum install -y yum-utils
设置仓库
国外
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
国内
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
配置阿里云镜像加速
找到 “容器镜像服务”–>“镜像加速器” 菜单
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
设置开机自启动docker
systemctl enable docker
启动docker
service docker start
K8S安装
K8s架构图
k8s最低配置要求
master 2核 4G 20G
node 4核 8G 40G
添加阿里云 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.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet
部署Kubernetes Master
kubeadm init \
--apiserver-advertise-address=10.0.2.9 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
apiserver-advertise-address 是master的IP,一定要对应自己master的IP
image-repository 默认镜像地址 k8s.gcr.io 国内无法访问,指定阿里云镜像仓库地址registry.aliyuncs.com/google_containers
service-cidr 无类别域间路由(Classless Inter-Domain Routing、CIDR)是一个用于给用户分配 IP 地址以及在互联网上有效地路由 IP 数据包的对 IP 地址进行归类的方法。 多个pod通过service对外提供服务,相当于对pod的负载均衡
如下提示成功
可以查看到拉取的镜像
按照提示,先执行如下代码,启动一个普通用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
其他非master节点加入
kubeadm join 10.0.2.9:6443 --token kg071x.bulpsdtvk24iju9q \
--discovery-token-ca-cert-hash sha256:0a2b4c3fafa14f45865da28859d8164d8e1f48e9ee83c71d022b428c296e4b42
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,在master服务器执行
kubeadm token create --print-join-command
注:master 状态为 notready。等待网络加入完成即可。
部署CNI网络插件(只要安装在master)
pod 网络插件安装,我们使用Flannel,apply 是应用kube-flannel.yml中的规定
kubectl apply -f \
https://raw.githubusercontent.com/coreos/flanne/master/Documentation/kube-flannel.yml
采用如下方式,预先下载kube-flannel.yml
kubectl apply -f kube-flannel.yml
如果要删除,可以用删除网络命令
kubectl delete -f kube-flannel.yml
获取所有名称空间的pods,如下图都为Running才算成功【要等一段时间】
kubectl get pods --all-namespaces
kube-flannel.yml中的flannel:v0.11.0-arm如果下载不了,建议到https://ub.docker.com/ 中找可以用的包,复制,把所有
测试kubernetes集群(在master执行)
创建nginx
kubectl create deployment nginx --image=nginx
对外暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
查看状态
kubectl get pod,svc
外网访问nginx端口如上图80对应的端口,http://192.168.56.101:31770/
至此已成功,以下可以不用看
其他方式
先下载镜像,编写master_images.sh文件
#!/bin/bash
images=(
kube-apiserver:v1.18.0
kube-proxy:v1.18.0
kube-controller-manager:v1.18.0
kube-scheduler:v1.18.0
coredns:1.6.5
etcd:3.4.3-0
pause:3.1
)
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
done
注:此文件是master所需的所有镜像,下面遍历循环下载所有镜像
把此文件上传到master服务器,修改权限,可读可写可执行 rwx
chmod 700 master_images.sh
执行master_images.sh
./master_images.sh
检查镜像,如下已经都下载成功 docker images
其他命令
查看 kubelet 日志
journalctl -u kubelet
获取所有节点
kubectl get nodes
获取pods
kubectl get pods
获取名称空间
kubectl get ns
监控网络
kubectl get pod -n kube-system -o wide
操作 kubernetes 集群
创建管理 Pod 的 Deployment, tomcat ,在master执行
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
重启k8s及docker服务
systemctl restart docker kubelet
删除deployment
kubectl delete deployment tomcat6
获取K8S所有资源
kubectl get all -o wide
可以获取到 tomcat 信息
kubectl get pods -o wide
获取所有名称空间的pods ,如下图flannel为running网络才算成功
kubectl get pods --all-namespaces
暴露 tomcat 访问,在master输入以下命令
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort
Pod 的 80 映射容器的 8080;service 会代理 Pod 的 80
查看service
kubectl get svc
kubectl get svc -o wide
如上图映射端口是31237,在node2主机上,所以访问地址如下
http://192.168.56.102:31237/
动态扩容测试
kubectl get deployment
–replicas=3是扩容3份
kubectl scale --replicas=3 deployment tomcat6
缩容成1份
kubectl scale --replicas=1 deployment tomcat6
删除
Kubectl get all
kubectl delete deploy/nginx
kubectl delete service/nginx-service
yaml
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run -o yaml
把yaml配置文件输出到/root/k8s/tomcat6.yaml
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run -o yaml > /root/k8s/tomcat6.yaml
获取某个pod的yaml信息
kubectl get pod tomcat6-5f7ccf4cb9-rg9q4 -o yaml
获取暴露yaml,如下截图类型是service,说明service来对pod负载均衡
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort --dry-run -o yaml
部署+暴露 tomcat6-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: tomcat6
name: tomcat6
spec:
replicas: 3
selector:
matchLabels:
app: tomcat6
template:
metadata:
labels:
app: tomcat6
spec:
containers:
- image: tomcat:6.0.53-jre8
name: tomcat
---
apiVersion: v1
kind: Service
metadata:
labels:
app: tomcat6
name: tomcat6
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: tomcat6
type: NodePort
删除deployment
kubectl delete deployment.apps/tomcat6
获取
kubectl get all
部署
kubectl apply -f tomcat6-deployment.yaml
Ingress
Ingress 底层是用nginx实现的,官网地址
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
kubectl apply -f ingress-controller.yaml
部署通过域名访问
ingress-tomcat6.yaml,注意serviceName和servicePort前面有两个空格
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web
spec:
rules:
- host: tomcat6.chen.com
http:
paths:
- backend:
serviceName: tomcat6
servicePort: 80
部署
kubectl apply -f ingress-tomcat6.yaml
修改本地hosts
https://blog.csdn.net/weixin_44371237/article/details/114002837
接着就可以直接访问 http://tomcat6.chen.com/