k8s–部署–01–在线–单master


1、介绍

1.1、机器介绍

主机名IP说明
master1192.168.187.1114核8G,硬盘20G,核数最小要求是2
node1192.168.187.1124核8G,硬盘20G,核数最小要求是2

1.2、软件环境

  1. 操作系统:centos
  2. docker版本:docker-ce-20.10.9-3.el7(k8s-1.23.6版本最高支持验证)
  3. Kubernetes版本:Kubernetes-1.23.6(高版本操作docker需要安装cri-dockerd,环境不好配置)

1.3、安装步骤

1.3.1、公共步骤

  • 集群hosts规划,集群环境访问需要
  • 服务器时间同步
  • 关闭无关的服务
  • 设置 rsyslogd 和 systemd journald
  • 禁用selinux、firewalld、swap
  • 内核配置
  • 安装ipvsadm
  • 安装指定版本docker
  • kubeadm、kubelet、kubectl安装
  • 更改kubelet的容器路径(如果需要的话,不需要可以跳过,我就没做)

1.3.2、集群步骤

  • 初始化主节点(仅master节点上操作)
  • 容器网络安装calico(仅master节点上操作)
  • 初始化k8s集群(子节点加入到集群中)

1.3.3、测试

安装nginx

2、公共步骤

所有机器都要做

2.1、集群hosts规划,集群环境访问需要

2.1.1、修改主机名

hostnamectl set-hostname master1
hostnamectl set-hostname node1

2.1.2、配置hosts文件

cat >> /etc/hosts  <<EOF
192.168.187.111   master1
192.168.187.112   node1
EOF

2.2、服务器时间同步

# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai

# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0

# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
 

# 更新系统时间 ,如果没有安装,使用这个命令安装:yum -y install ntpdate 
ntpdate cn.pool.ntp.org

2.3、关闭无关的服务

systemctl stop postfix && systemctl disable postfix

2.4、设置 rsyslogd 和 systemd journald

systemd的journald 是 Centos 7 缺省的日志记录工具,它记录了所有系统、内核、Service Unit 的日志。
systemd journald 有如下优势:

  1. 可以记录到内存或文件系统;(默认记录到内存,对应的位置为 /run/log/jounal)
  2. 可以限制占用的磁盘空间、保证磁盘剩余空间;
  3. 可以限制日志文件大小、保存的时间;

journald 默认将日志转发给 rsyslog,这会导致日志写了多份,/var/log/messages 中包含了太多无关日志,不方便后续查看,同时也影响系统性能。


mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent

# 压缩历史日志
Compress=yes

SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000

# 最大占用空间 10G
SystemMaxUse=10G

# 单日志文件最大 200M
SystemMaxFileSize=200M

# 日志保存时间 2 周
MaxRetentionSec=2week

# 不将日志转发到 syslog
ForwardToSyslog=no
EOF

# 重启systemd-journald
systemctl restart systemd-journald


2.5、禁用selinux、firewalld、swap

# 停止防火墙
systemctl stop firewalld
# 禁用防火墙
systemctl disable firewalld



# 禁用selinux
 
# 将 selinux 文件中的 SELINUX=enforcing 替换为 SELINUX=disabled
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
# 将 config 文件中的 SELINUX=enforcing 替换为 SELINUX=disabled
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config


 
# 永久禁用swap分区,/etc/fstab中注释掉swap那一行。 
sed -i 's/.*swap.*/#&/' /etc/fstab


2.6、内核配置

2.6.1、kubernetes.conf

cat > /etc/sysctl.d/kubernetes.conf << EOF


net.ipv4.ip_forward = 1 # 地址转发 
net.bridge.bridge-nf-call-iptables = 1 # 添加网桥过滤
net.bridge.bridge-nf-call-ip6tables = 1 # 添加网桥过滤
fs.may_detach_mounts = 1
net.ipv4.conf.all.route_localnet = 1
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.panic_on_oom=0 #开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576

fs.file-max=52706963
fs.nr_open=52706963

net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720

 
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
 

# 生效命令
sysctl --system



2.6.2、配置limits

vim /etc/security/limits.conf

# 末尾添加
* soft nofile 65536
* hard nofile 131072
* soft nproc 65535
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited


2.6.3、重启服务

# 重启服务
systemctl reboot

2.7、安装ipvsadm

不开启ipvs将会使用iptables,但是效率低,所以官网推荐需要开通ipvs内核

2.7.1、安装ipvsadm

# 安装ipvsadm
yum install -y ipvsadm ipset sysstat conntrack libseccomp

2.7.2、配置ipvs模块

# 配置ipvs模块
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack

2.7.3、修改ipvs.conf配置文件

vim /etc/modules-load.d/ipvs.conf

# 加入以下内容
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip

2.7.4、启动

systemctl enable --now systemd-modules-load.service 

# 查看  
[root@master1 ~]# lsmod | grep --color=auto -e ip_vs -e nf_conntrack
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          139264  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

 

2.8、安装指定版本docker

2.8.1、安装必要的一些系统工具

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2.8.2、添加软件源信息

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 修改配置
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
 

2.8.3、更新软件源缓存,如果centos版本大于7,使用sudo yum makecache即可

sudo yum makecache fast
 

2.8.4、查看docker版本列表

x86_64(x86架构)

# 查看docker版本列表
[root@master1 ~]# yum list docker-ce --showduplicates | sort -r
已加载插件:fastestmirror
已安装的软件包
可安装的软件包
 * updates: mirrors.aliyun.com
Loading mirror speeds from cached hostfile
 * extras: mirrors.aliyun.com
docker-ce.x86_64            3:24.0.7-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.6-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.5-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.4-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.3-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.2-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.1-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.0-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.6-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.5-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.4-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.3-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.2-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.1-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.0-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:20.10.9-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.9-3.el7                    @docker-ce-stable
docker-ce.x86_64            3:20.10.8-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.7-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.6-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.5-3.el7                    docker-ce-stable 


2.8.5、安装指定版本的Docker-CE: (VERSION例如上面的3:20.10.9-3.el7)

sudo yum install -y docker-ce-20.10.9-3.el7

2.8.6、启动docker

# 启动docker
systemctl start docker

# 设置开机启动
systemctl enable docker

2.8.7、配置docker,修改cgroup、log、镜像地址

cat > /etc/docker/daemon.json << EOF
{
    "registry-mirrors": [
        "https://docker.mirrors.ustc.edu.cn/",
        "https://hub-mirror.c.163.com/"
    ],
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
        "cache-compress": "true",
        "cache-disabled": "false",
        "cache-max-file": "5",
        "cache-max-size": "20m",
        "env": "os,customer",
        "max-file": "2",
        "max-size": "100m"
    }
}
EOF

2.8.8、重启docker服务

systemctl restart docker

2.9、kubeadm、kubelet、kubectl安装

# kubernetes镜像切换成国内源,baseurl中注意架构类型
# x86架构:baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
# arm架构:baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/

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=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

# 安装指定版本 kubeadm、kubelet、kubectl
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6

# 开机自启动
systemctl enable kubelet


2.10、更改kubelet的容器路径(如果需要的话,不需要可以跳过,我就没做)

vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf


# 修改完之后配置文件如下
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --root-dir=/mnt/sdb_new/kubelet/ --kubeconfig=/etc/kubernetes/kubelet.conf"



# 使配置生效
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet

3、集群步骤

3.1、初始化主节点(仅master节点上操作)

kubeadm init \
  --apiserver-advertise-address=192.168.187.111 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.6 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16



3.1.1、命令说明

  • apiserver-advertise-address:集群通告地址(master 机器IP)
  • image-repository:由于默认拉取镜像地址k8s.gcr.io,国内无法访问,这里指定阿里云镜像仓库地址
  • kubernetes-version:K8s版本,与上面安装的一致
  • service-cidr:集群内部虚拟网络,Pod统一访问入口,默认:10.96.0.0/12
  • pod-network-cidr:Pod网络,与下面部署的CNI网络组件yaml中保持一致,默认:10.244.0.0/16

3.1.2、创建成功示例



[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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 192.168.187.111:6443 --token txbhsf.yqzxkeo7sdxobt1j \
	--discovery-token-ca-cert-hash sha256:2c19030ed185bc30f86f9638d47f1cf6a237f06d454fa8638444ea933b9f12c6 


 lowing on each as root:


 

3.1.3、保存后续子节点加入集群的命令

kubeadm join 192.168.187.111:6443 --token txbhsf.yqzxkeo7sdxobt1j \
	--discovery-token-ca-cert-hash sha256:2c19030ed185bc30f86f9638d47f1cf6a237f06d454fa8638444ea933b9f12c6 

# 默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要在master上重新创建token,创建命令如下
kubeadm token create --print-join-command

3.1.4、按要求执行后续步骤

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config


# 查看节点状态
[root@master1 ~]# kubectl get node
NAME      STATUS     ROLES                  AGE   VERSION
master1   NotReady   control-plane,master   60s   v1.23.6
 

3.2、容器网络安装calico(仅master节点上操作)

# 下载网络组建的yaml文件,使用容器部署
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate

# 修改文件网络地址配置
#修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 –pod-network-cidr指定的一样
# 示例:
# - name: CALICO_IPV4POOL_CIDR
#   value: "10.244.0.0/16"



# 创建网络组件
kubectl apply -f calico.yaml

# 查看安装进度
kubectl get pods -n kube-system -w


3.3、初始化k8s集群(子节点加入到集群中)

# 在node节点上,执行master主节点初始化集群成功的加入命令,等待节点初始化完成
kubeadm join 192.168.187.111:6443 --token txbhsf.yqzxkeo7sdxobt1j \
	--discovery-token-ca-cert-hash sha256:2c19030ed185bc30f86f9638d47f1cf6a237f06d454fa8638444ea933b9f12c6 



# master上查看节点状态(需要等待一段时间)
[root@master1 ~]# kubectl get nodes
NAME      STATUS   ROLES                  AGE    VERSION
master1   Ready    control-plane,master   11m    v1.23.6
node1     Ready    <none>                 4m4s   v1.23.6





# 查看系统组件安装状态(需要等待一段时间)
[root@master1 ~]# kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-57c6dcfb5b-tb28k   1/1     Running   0          5m54s
calico-node-b9646                          1/1     Running   0          5m54s
calico-node-d66hm                          1/1     Running   0          5m30s
coredns-6d8c4cb4d-4lj4k                    1/1     Running   0          12m
coredns-6d8c4cb4d-jfjc8                    1/1     Running   0          12m
etcd-master1                               1/1     Running   0          12m
kube-apiserver-master1                     1/1     Running   0          12m
kube-controller-manager-master1            1/1     Running   0          12m
kube-proxy-62fp9                           1/1     Running   0          12m
kube-proxy-h2z7g                           1/1     Running   0          5m30s
kube-scheduler-master1                     1/1     Running   0          12m


4、测试(master节点上操作)

部署nginx pod

4.1、nginx.yaml

vim nginx.yaml

内容

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

4.2、nginx-service.yaml

vim nginx-service.yaml

内容

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80


4.3、部署nginx服务

# 部署nginx服务
kubectl apply -f nginx.yaml
kubectl apply -f nginx-service.yaml

# 查看服务 (Running说明启动成功)
[root@master1 ~]# kubectl get pod,svc
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-85b98978db-tntd6   1/1     Running   0          2m2s

NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP        27m
service/nginx-service   NodePort    10.98.77.182   <none>        80:32224/TCP   2m

 

4.4、浏览器访问

http://192.168.187.111:32224/

在这里插入图片描述

Logo

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

更多推荐