环境: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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐