中文官网:https://kubernetes.io/zh/
k8s 是分布式部署管理工具,用于容器的部署和编排
Kubernetes 简称 k8s。是用于自动部署,扩展和管理容器化应用程序的开源系统。
中文官网:https://kubernetes.io/zh/
中文社区:https://www.kubernetes.org.cn/
官方文档:https://kubernetes.io/zh/docs/home/
社区文档:http://docs.kubernetes.org.cn/
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具。
这个工具能通过两条指令完成一个 kubernetes 集群的部署:
# 创建一个 Master 节点
$ kubeadm init
# 将一个 Node 节点加入到当前集群中
$ kubeadm join <Master 节点的 IP 和端口 >
一台或多台机器,操作系统 CentOS7.x-86_x64
硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
集群中所有机器之间网络互通
可以访问外网,需要拉取镜像
禁止linux的 swap 分区
1.在所有节点上安装 Docker 和 kubeadm
2.部署 Kubernetes Master
3.部署容器网络插件
4.部署 Kubernetes Node,将节点加入 Kubernetes 集群中
5.部署 Dashboard Web 页面,可视化查看 Kubernetes 资源
● 使用我们提供的 vagrant 文件,复制到非中文无空格目录下,运行
vagrant up
启动三个虚拟机。其实 vagrant 完全可以一键部署全部 k8s 集群。
https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster
http://github.com/davidkbainbridge/k8s-playground
● 默认创建的虚拟器只能用ssh访问,为了让客户端(如xshell访问)我们需要进行以下设置,进入三个虚拟机,开启 root 的密码访问权限。
##进去系统之后
Vagrant ssh XXX `vagrant ssh k8s-node1`
su root 密码为 vagrant
vi /etc/ssh/sshd_config
修改 PasswordAuthentication yes/no
##重启服务
service sshd restart
所有虚拟机设置为 4 核 4G
设置好 NAT 网络
把k8s文件夹复制到一个没有中文和空格的文件夹路径下。
在k8s 文件夹下运行 vagrant up 代码
Vagrant ssh XXX
su root 密码为 vagrant
vi /etc/ssh/sshd_config 修改 PasswordAuthentication no 为 PasswordAuthentication yes
重启服务 service sshd restart
这样就可以通过xshell去连接我们的虚拟机了。
设置网络,由于当前虚拟机使用的网卡是eth0
所以需要设置每个虚拟机的网卡
为每一个虚拟机船舰net网络
设置完成后
ping 以下买个机器都能联通其他的两个机器并且都能ping 通baidu.com(外网)
## 关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
=================================
## 关闭 selinux 安全策略:
sed -i 's/enforcing/disabled/' /etc/selinux/config
## 查看selinux 安全策略
cat /etc/selinux/config 可以看到:SELINUX=disabled
## 禁掉当前会话
#setenforce 0
=================================
##关闭 swap 内存交换:
#临时关闭
#swapoff -a
#永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
cat /etc/fstab 可以看到:#/swapfile none swap defaults 0 0
free -g 验证,swap 必须为 0;
=================================
## 添加主机名与 IP 对应关系
vi /etc/hosts
10.0.2.10 k8s-node1
10.0.2.9 k8s-node2
10.0.2.15 k8s-node3
hostnamectl set-hostname :指定新的 hostname(可以不做)
=================================
## 将桥接的 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
=================================
##疑难问题:
##遇见提示是只读的文件系统,运行如下命令
mount -o remount rw /
date 查看时间 (可选)
yum install -y ntpdate
ntpdate time.windows.com 同步最新时间
为每个会话发送西悉尼
这样在任意会话中发送消息,所有会话都会执行。
关闭防火墙
关闭 selinux
关闭 swap 内存交换
添加主机名称与ip对应关系
找到ip每个node的ip并完成下面的对应关系,我本机的如下:
10.0.2.5 k8s-node1
10.0.2.4 k8s-node2
10.0.2.6 k8s-node3
修改host文件:vi /etc/hosts
将桥接的 IPv4 流量传递到 iptables 的链
养成好习惯,为每个虚拟机生成一个备份
Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。
kubeadm 用户建立k8s master 和 node 建立完成后就没用了
## 1 卸载系统之前的 docker 下面是一整句
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
## 2 安装 Docker-CE
## 安装必须的依赖
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
## 3 设置 docker repo 的 yum 位置,这个仓库已经被禁用了 代码返回:fastestmirror。
## sudo yum-config-manager \ --add-repo \https://download.docker.com/linux/centos/docker-ce.repo
## 可以使用alibab的仓库来替换
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
## 4 安装 docker,以及 docker-cli
sudo yum install -y docker-ce docker-ce-cli containerd.io
## 5 配置 docker 加速 (选做) 这步不要做,会有问题。
## 如果做了导致docker 无法启动记得删除/etc/docker 这个文件加然后重新安装。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' {
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
## 6 启动 docker & 设置 docker 开机自启,一定要做这一步
systemctl enable docker
基础环境准备好,可以给三个虚拟机备份一下;为 node3 分配 16g,剩下的 3g。方便未来 侧测试
第四步:安装docker完成后,重启docker 报错sudo systemctl restart docker
Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl -xe” for details.
问题可能2个
第一种:执行了第5步,第5步有我问题不能执行。
如果执行就需要删除/etc/docker 文件
rm -rf docker/
第二种:可能是虚拟机的内核版本太低造成的可以升级虚拟机内核,因为docker默认安装的是最新的版本,可能与虚拟机的版本不对应。
## 查看安装过的包
yum list installed | grep docker
## 删除安装的Docker相关的软件包
yum remove docker-*
## 查看内核版本【Docker要求Centos系统的内核版本高于3.10】
uname -r
## 把yum包更新到最新(时间可能有点长,慢慢等待......
yum update
## 查看仓库的docker版本
yum list docker-ce --showduplicates | sort -r
## 启动docker,设置开机启动docker。
systemctl start docker
systemctl enable docker
阿里云镜像地址:https://developer.aliyun.com/mirro
添加仓库
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
安装kubelet kubeadm kubectl
yum list|grep kubeyum
## 安装安装 kubeadm,kubelet 和 kubectl ps:一定要加上--nogpgcheck
yum install -y --nogpgcheck kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
## 一定要设置开机启动
systemctl enable kubelet
systemctl start kubelet
#如果安装过程有问题可以查找&删除包
#yum list installed | grep kub*
#yum remove kub*
#命令查询一下kubeadm所需的k8s镜像包版本doc,本案例中查询出来的版本不一致,不知道会不会有影响
#kubeadm config images list
## 在虚拟机的root下上传k8s文件夹
## 修改master_images.sh 的读写权限
chmod 700 master_images.sh
## 查看文件权限 -rwx------ 1 root root 396 Jul 29 00:53 master_images.sh
ll
## 执行批处理下载镜像
./master_images.sh
## 获取当前ip设置下面的初始化语句
ip route show
ip addr
## 初始化kubeadm
kubeadm init --apiserver-advertise-address=10.0.2.10 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version v1.17.3 --service-cidr=10.96.0.0/16 --pod-network-cidr=10.244.0.0/16
由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。可以手动
按照我们的 images.sh 先拉取镜像,
地址变为 registry.aliyuncs.com/google_containers 也可以。
科普:无类别域间路由(Classless Inter-Domain Routing、CIDR)是一个用于给用户分配 IP
地址以及在互联网上有效地路由 IP 数据包的对 IP 地址进行归类的方法。
拉取可能失败,需要下载镜像。
运行完成提前复制:加入集群的令牌
在虚拟机的root下上传k8s文件夹
在linux下进入k8s 目录修改master_images.sh 文件的访问权限
chmod 700 master_images.sh
master_images.sh 文件内容
#!/bin/bash
images=(
kube-apiserver:v1.17.3
kube-proxy:v1.17.3
kube-controller-manager:v1.17.3
kube-scheduler:v1.17.3
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_images.sh
找到当前网卡的地址为:10.0.2.10
初始化kubeadm
kubeadm init \
--apiserver-advertise-address=10.0.2.10 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
最后的这段代码非常重要:control-plane 初始化成功后,下面提示时如何操作kubeadm的步骤
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.2.10:6443 --token 7jcznm.jpghgif9ayor1al1 \
--discovery-token-ca-cert-hash sha256:054d3b42012f03e1c8d59f07adc3fa14efb729f4a6caaa9fc734a9f70c00c53b
###第一步##################################################
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
## 获取获取节点 目前 master 状态为 notready。等待网络加入完成即可
kubectl get nodes
## 查看 kubelet 日志
journalctl -u kubelet
###第二步##################################################
## 网络安装
kubectl apply -f \ https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
## 本地安装 在k8s 文件加下如果网络安装不上就用下面的
chmod 700 kube-flannel.yml
kubectl apply -f kube-flannel.yml
## 如果安装有问题需要删除
## kubectl delete -f kube-flannel.yml
## 获取所有的名称空间
kubectl get ns
## 获取到所有的pods以及名称空间
kubectl get pods --all-namespaces
## 把这个节点加入到kubeadm 中 这段代码是上面初始化kubeadm 后生成的
## 054d3b42012f03e1c8d59f07adc3fa14efb729f4a6caaa9fc734a9f70c00c53b 这是token是临时生成的有效时间2小时。
###第三步##################################################
kubeadm join 10.0.2.10:6443 --token 7jcznm.jpghgif9ayor1al1 \
--discovery-token-ca-cert-hash sha256:054d3b42012f03e1c8d59f07adc3fa14efb729f4a6caaa9fc734a9f70c00c53b
## 第四步:如果上面的token过期
kubeadm token create --print-join-command
kubeadm token create --ttl 0 --print-join-command
kubeadm join 10.0.2.10:6443 --token 7jcznm.jpghgif9ayor1al1 \
--discovery-token-ca-cert-hash sha256:054d3b42012f03e1c8d59f07adc3fa14efb729f4a6caaa9fc734a9f70c00c53b
## 监控 pod 状态
watch kubectl get pod -n kube-system -o wide
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
用于pod之间的相互通信地址
## 网络安装
kubectl apply -f \ https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
## 本地安装 在k8s 文件加下如果网络安装不上就用下面的
chmod 700 kube-flannel.yml
kubectl apply -f kube-flannel.yml
## 如果安装有问题需要删除
## kubectl delete -f kube-flannel.yml
## 获取所有的名称空间
kubectl get ns
## 获取到所有的pods
kubectl get pods --all-namespaces
在子节点中运行
kubeadm join 10.0.2.10:6443 --token 7jcznm.jpghgif9ayor1al1 \
--discovery-token-ca-cert-hash sha256:054d3b42012f03e1c8d59f07adc3fa14efb729f4a6caaa9fc734a9f70c00c53b
官网api:https://kubernetes.io/zh/docs/reference/#cli
## 当前api支持的资源
kubectl api-resources
## 获取所有已安装的资源
Kubectl get all
##测试开始
## 1.部署一个tomcat
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
## 获取所有的pods详细信息
kubectl get pods -o wide
## 获取所有的pods名称空间信息
kubectl get pods --all-namespaces
## 2.暴露 tomcat6 对外访问
## Pod 的 80 映射容器的 8080;service 会代理 Pod 的 80 由于这么没有指定service的端口,所以会随机生成一个端口
## --type=NodePort 会生成一个对外的service 暴露给外部访问,一个service可以包含多个pod ,一个pod中可以有多个容器
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort
## 查看生成的service
kubectl get service
## 3.动态扩容测试,扩容了多份,所有无论访问哪个 node 的指定端口,都可以访问到 tomcat6
### 查看需要扩容的deployment
kubectl get deployment
### 扩容
kubectl scale --replicas=3 deployment tomcat6
### 查看扩容后的结果
kubectl get pods -o wide
## 部署三份
kubectl scale --replicas=3 deployment tomcat6
## 4.以上操作的 yaml 获取
## 5、删除
Kubectl get all
kubectl delete deploy/nginx
kubectl delete service/nginx-service
流程:创建 deployment 会管理 replicas,replicas 控制 pod 数量,有 pod 故障会自动拉起 新的 pod
外部访问tomcat6,任意一个节点都可以访问
。
扩容3份
上面的访问依然没有问题
删除部署
## 生成一个tomcat6 模板
### --dry-run 表示测试不会真的执行。
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run -o yaml > tomcat6.yaml
## 修改tomcat6.yaml 保存部署的最简信息
vi tomcat6.yaml
部署的最简信息 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
通过yaml部署
## 通过yaml部署
kubectl apply -f tomcat6.yaml
kubectl apply -f tomcat6.yaml
## 暴露服务
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort --dry-run -o yaml
1、kubectl 文档:https://kubernetes.io/zh/docs/reference/kubectl/overview/
2、资源类型
https://kubernetes.io/zh/docs/reference/kubectl/overview/#%E8%B5%84%E6%BA%90%E7%B1%B B%E5%9E%8B
3、格式化输出
https://kubernetes.io/zh/docs/reference/kubectl/overview/#%E6%A0%BC%E5%BC%8F%E5%8C%9 6%E8%BE%93%E5%87%BA
4、常用操作
https://kubernetes.io/zh/docs/reference/kubectl/overview/#%E7%A4%BA%E4%BE%8B-%E5%B8% B8%E7%94%A8%E6%93%8D%E4%BD%9C
5、命令参考
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
参照官方文档
https://kubernetes.io/zh/docs/concepts/workloads/pods/#pods-and-controllers
Pod 和控制器 控制器可以为您创建和管理多个 Pod,管理副本和上线,并在集群范围内提供自修复能力。 例如,如果一个节点失败,控制器可以在不同的节点上调度一样的替身来自动替换 Pod。 包含一个或多个 Pod 的控制器一些示例包括: Deployment StatefulSet DaemonSet 控制器通常使用您提供的 Pod 模板来创建它所负责的 Pod
Deployment 可以通过部署来部署一个pod,pod想要通过外部访问,需要通过service暴露端口。
1、部署一个 nginx
kubectl create deployment nginx --image=nginx
2、暴露 nginx 访问 kubectl expose deployment nginx --port=80 --type=NodePort
统一应用访问入口; Service 管理一组 Pod。 防止 Pod 失联(服务发现)、定义一组 Pod 的访问策略 现在 Service 我们使用 NodePort 的方式暴露,这样访问每个节点的端口,都可以访问到这 个 Pod,如果节点宕机,就会出现问题。
可以为每个pod 添加label 抱歉,类似于css中class 这样就可以通过selectors(选择器)来统一操作相同标签的资源。
相当于为我们每一个节点部署了一个nginx,然后通过nginx负载均衡到pod。
通过 Service 发现 Pod 进行关联。基于域名访问。 通过 Ingress Controller 实现 Pod 负载均衡 支持 TCP/UDP 4 层负载均衡和 HTTP 7 层负载均衡
步骤: 1)、部署 Ingress Controller 2)、创建 Ingress 规则
Ingress 实现通过域名访问负载到不同的机器。
第一步:为每个节点部署部署 Ingress Controller
## 通过yaml为每个节点创建Ingress
kubectl apply -f ingress-controller.yaml
## 查看安装情况
kubectl get pods --all-namespaces
安装pod和暴露service的yaml
kubectl apply -f ingress.yaml
ingress.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
查看ingress-controller.yaml 配置
查看安装情况
第二步:创建 Ingress 规则
webdd
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web
spec:
rules:
- host: tomcat6.kubenetes.com
http:
paths:
- backend:
serviceName: tomcat6
servicePort: 80
修改host文件
192.168.56.102 tomcat6.kubenetes.com
测试:http://tomcat6.kubenetes.com/
Kubernetes 的网络模型从内至外 由四个部分组成:
1、Pod 内部容器所在的网络
2、Pod 所在的网络
3、Pod 和 Service 之间通信的网 络
4、外界与 Service 之间通信的网