环境:3台centos7服务器:
master:192.168.1.13
node1:192.168.1.26
node2:192.168.1.27
#修改主机名:
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
#三台主机配置hosts
cat /etc/hosts
192.168.1.13 master
192.168.1.26 node1
192.168.1.27 node2
#时间同步
yum install chrony -y
#启动chronyd服务
systemctl start chronyd
systemctl enable chronyd
date
#设置时区
timedatectl set-timezone Asia/Shanghai
#关闭防火墙,禁用selinux,swap分区,设置文件最大可打开数
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config #重启后生效
setenforce 0 #临时生效
vi /etc/fstab
#注释掉下面的设置
/dev/mapper/centos-swap swap
free -m #查看状态
swapoff -a #临时
ulimit -n 65535
vi /etc/security/limits.conf
#添加如下参数:
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
#添加网桥过滤和地址转发功能
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
#然后执行
sysctl --system //生效命令
一.docker 安装及docker images准备
1、docker安装
# 配置yum源
cd /etc/yum.repos.d ; mkdir bak; mv CentOS-Linux-* bak/
# centos7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 安装yum-config-manager配置工具
yum -y install yum-utils
# 设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker-ce版本
yum install -y docker-ce
# 启动
systemctl start docker
# 开机自启
systemctl enable docker
# 查看版本号
docker --version
# 查看版本具体信息
docker version
# Docker镜像源设置
# 修改文件 /etc/docker/daemon.json,没有这个文件就创建
# 添加以下内容后,重启docker服务:
cat >/etc/docker/daemon.json<<EOF
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
# 加载
systemctl reload docker
# 查看
systemctl status docker containerd
2、docker images 准备
①新建/root/docker/myweb目录,将apache-tomcat-8.5.93.tar.gz、jdk-8u291-linux-x64.tar.gz放到目录中,在目录中新建dockerfile文件
cat dockerfile
FROM centos:7
ADD apache-tomcat-8.5.93.tar.gz /usr/local/
ADD jdk-8u291-linux-x64.tar.gz /usr/local/
# 定义工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 设置JAVA_HOME 环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_291
# 设置CLASSPATH 环境变量
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.93
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.93
# 设置PATH
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 暴露端口
EXPOSE 8080
# 指定容器启动后执行的命令
CMD /usr/local/apache-tomcat-8.5.93/bin/startup.sh && tail -f /usr/local/apache-tomcat-8.5.93/logs/catalina.out
②构建镜像
docker build -t myweb:v1 .
docker images #查看镜像
③打包镜像
docker save myweb:v1 -o /app/myweb.tar
④node加载镜像
免密登录配置:
ssh-keygen
ssh-copy-id root@node1
ssh-copy-id root@node2
将上一步导出的镜像myweb.tar传到node节点并加载images:
scp myweb.tar root@node1:/root/
scp myweb.tar root@node2:/root/
docker load -i myweb.tar
二、k8s安装及部署
1、k8s镜像设为国内源
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
2、安装指定版本的kubelet、kubeadm、kubectl
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
systemctl enable kubelet
3、部署k8s
kubeadm init \
--apiserver-advertise-address=192.168.1.13 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
####
–apiserver-advertise-address #集群通告地址(master 机器IP)
–image-repository #由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
–kubernetes-version #K8s版本,与上面安装的一致
–service-cidr #集群内部虚拟网络,Pod统一访问入口
–pod-network-cidr #Pod网络,与下面部署的CNI网络组件yaml中保持一致
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
把初始化生成的 join 命令 在这里执行:
下面的操作只需要在node节点上执行即可(下面的命令是 k8s初始化的时候 生成的)
node节点执行:
kubeadm join 192.168.1.13:6443 --token bqmca3.ckugqq5di79vs8l6 \
--discovery-token-ca-cert-hash sha256:acdb43aebb125c2beead9ca636de368d686dab3a0b2f398f71599669f2199752
24h过期重新生成命令:kubeadm token create --print-join-command
4、部署容器网络
Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。 下载YAML:
wget https://docs.projectcalico.org/manifests/calico.yaml
下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的
–pod-network-cidr指定的一样
master上执行:
kubectl apply -f calico.yaml
kubectl get nodes #查看节点
kubectl get pods -n kube-system -w(-w可以不带) #查看通信状态
三、部署自己的web
1、master节点编写yaml文件并创建资源
cat deploy.yaml
apiVersion: apps/v1 #指定api版本标签
kind: Deployment #定义资源类型
metadata:
name: myweb #定义资源名称
spec:
replicas: 2 #定义副本数量
selector:
matchLabels: #定义标签选择器,与被控制对象绑定
name: myweb
template:
metadata: #定义标签选择器
labels:
name: myweb
spec:
containers: #定义容器属性
- name: myweb #镜像名称,一个name定义一个容器,多个容器使用`-`区分
image: myweb:v1 #镜像地址
imagePullPolicy: IfNotPresent #拉取策略
ports:
- name: myweb #端口名称
containerPort: 8080 #容器端口
protocol: TCP #端口协议
resources: #资源管理
limits:
cpu: 500m
memory: 1024Mi
requests:
cpu: 200m
memory: 1024Mi
volumeMounts: #定义数据卷目录,没有自动创建
- name: vol-myweb-data
mountPath: /usr/local/apache-tomcat-8.5.93/webapps
- name: mysql
image: mysql:5.7
resources:
requests:
memory: 1Gi
cpu: 500m
limits:
memory: 1Gi
cpu: 500m
ports:
- name: mysql
containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: root #设置root密码
args:
- --character-set-server=utf8mb4 #字符集为utf8
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1 #不区分大小写
volumeMounts: #定义数据卷目录,没有自动创建
- name: vol-mysql-data
mountPath: /var/lib/mysql
volumes: #定义数据卷挂载目录
- name: vol-mysql-data
hostPath:
path: /usr/lib/mysql
- name: vol-myweb-data
hostPath:
path: /root/k8s/web/myweb
#通过yaml文件创建实例
kubectl apply -f deploy.yaml
kubectl get deploy,pod -o wide #查看deploy,pod状态
2、创建service资源
cat svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb-svc
spec:
ports:
- name: myweb #端口名称,一个name定义一个端口
nodePort: 31369 #集群对外暴露端口,通过nodeip:nodePort访问
port: 18080 #集群内部访问端口,通过ClusterIP:prot访问
protocol: TCP
targetPort: 8080 #目标端口,也就是容器的端口
- name: mysql
nodePort: 31379
port: 13306
protocol: TCP
targetPort: 3306
selector:
name: myweb #指定label标签的pod绑定
type: NodePort #services类型,默认ClusterIP,NodePort时可指定端口
kubectl apply -f svc.yaml
kubectl get deploy,pod,svc -o wide #查看deploy,pod,svc状态
在node1、node2的/root/k8s/web/myweb目录下ROOT下创建测试页面index.html
cat index.html
test1_node1
test2_node2
3、docker安装nginx反向代理k8s集群的tomcat
mkdir -p /root/docker/nginx/conf.d
mkdir -p /root/docker/nginx/html
mkdir -p /root/docker/nginx/lo
运行docker命令:
docker run -d -v /root/docker/nginx/conf.d/:/etc/nginx/conf.d/ -v /root/docker/nginx/html/:/usr/share/nginx/html -v /root/docker/nginx/logs/:/var/log/nginx -p 80:80 -p 443:443 --name=nginx --restart=always --privileged=true nginx
#创建/root/docker/nginx/conf.d/test.conf nginx代理文件
cat /root/docker/nginx/conf.d/test.conf
upstream test {
server 192.168.1.13:31369 max_fails=5 fail_timeout=60s;
}
server {
listen 80;
server_name _;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://test;
}
}
docker ps #查看容器
通过nginx服务器的ip访问自己的web,刷新页面会交替访问node1和node2
192.168.1.13
kubectl常用命令:
kubectl apply -f ***.yaml #创建调度
kubectl get nodes #查看节点状态
kubectl get deploy,pods,svc -o wide #查看各种状态
kubectl exec -it [pod] -c [container] -- [command] #进入pod、容器执行命令
kubectl cp *** pod:/dir/ #复制文件到容器
kubectl delete pod pod_name #重载pod
kubectl delete deploy deploy_name #删除调度,彻底删除pod