k8s 搭建 kubeadm方式
k8s 集群搭建
配置主机名以及host文件(主从都需要做)
# set hostname
hostnamectl set-hostname k8s-mastere1
# set host file
ip=$(ifconfig | awk '/netmask 255.255./{print $2}')
echo $ip $(hostname) >> /etc/hosts
安装依赖包(主从都需要做)
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
设置防火墙为iptables 并设置空规则(主从都需要做)
# stop firewall
systemctl stop firewall & systemctl disable firewall
# install and start iptables
yum -y install iptables-services & systemctl start iptables & systemctl enable iptables & iptables -F & service iptables save
关闭selinux(主从都需要做)
#
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
#
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
调整内核参数(主从都需要做)
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.Bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 非禁止使用 swap 空间,只有当系统 00 时才允许使用它
vm.overcommit_memory=1 #不检物理内存是否够用
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
EOF
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
调整系统时区(主从都需要做)
# 设置系统时区为电国/上海
timedatectl set-timezone Asia/Shanghai
#将当前的 UTC 时写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系統时间的服务
systemctl restart rsyslog
systemctl restart crond
关闭系统不需要的服务(主从都需要做)
systemctl stop postfix & systemctl disable postfix
设置rsyslogd和systemd journald。centos 7默认有两个日志程序(主从都需要做)
mkdir /var/log/journal #持久化保存日志的目录
mkdir /etc/systemd/journal.conf.d
cat > /etc/systemd/journal.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
systemctl restart systemd-journald
升级内核到最新版本版本(主从都需要做)
centos 7 系统自带的3.10.x内核存在一些bug,导致运行的docker、kubernetes不稳定,例如: rpm -Uvh http://www.elrepo.org/elrepo-release-7.0.3.el7.elrepo.noarch.rpm
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有在安装一次;
#查看最新版内核
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# 内核版本说明:
#kernel-ml #主线版本,比较新
#kernel-lt #长期支持版本,比较旧
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 配置开机从新内核启动
# grub2-set-default "CentOS Linux (5.4.144-1.el7.elrepo.x86_64) 7 (Core)"
#查看系统上的所有可用内核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
grub2-set-default 0 #设置默认内核版本
# 重新创建内核配置
grub2-mkconfig -o /boot/grub2/grub.cfg
#查看默认内核
grub2-editenv list
# 重启
reboot
注意:系统update之后内核通常情况下回变动。如果变动,请重新更新内核到最新版本
kube-proxy开启ipvs的前置条件(主从都需要做)
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
# modprobe -- nf_conntrack_ipv4 # 在比较新的内核中,nf_conntrack 替代了 nf_conntrack——ipv4模块
# 参考连接:https://github.com/coreos/coreos-overlay/pull/3457/commits/a24dbb6cb639d7e87c38502558336bdfe16f55b0
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
安装docker 软件(主从都需要做)
# 依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 国内的朋友可以配置阿里云源,如果机器在海外,可以不用配置
#yum-config-manager \
# --add-repo \
# http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum update -y
# 安装docker
# https://docs.docker.com/engine/install/centos/
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker指定版本
# yum install docker-ce docker-ce-cli containerd.io
yum install -y docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
systemctl start docker
## 创建/etc/docker 目录
mkdir /etc/docker
#配置 daemon
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# 重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
安装 Kubeadm(主从都配置)
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1 --disableexcludes=kubernetes
systemctl enable --now kubelet.service
初始化主节点
kubeadm config print init-defaults > kubeadm-config.yaml
# 修改 kubeadm-config.yaml 中的如下配置
localAPIEndpoint:
# 当前的内网ip地址
advertiseaddress: 192.168.66.10
# 当前我们安装的版本
kubernetesVersion: v1.15.1
networking:
# 默认我们会安装flanal去实现网络穿透,它的默认podnet网断就是该网断,如果k8spod 网断和它不同,后期需要再修改,麻烦
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
# 然后配置文件添加如下字段,修改调度方式为ipvs
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
# 初始化集群,然后默认自动安装证书
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
注意
如果安装失败;
- 如果是云主机,检查安全组对外开放端口;要求:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#check-required-ports
- 停止 kubelte ;systemctl stop kubelet.service
- docker stop $(docker ps -qa);docker rm -f $(docker ps -aq)
- 删除 rm -rf /etc/kubernetes、rm -rf /var/lib/etcd 、rm -rf /var/lib/kubelet/
- 然后重装
加入主节点
# 执行安装日志中的加入命令即可,类似这样的:
kubeadm join 172.31.40.199:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:768eb1bfeebaf5596c21f9e8f7fa63c0c23e3ea57a9258d65f881a8bbb0f442a
部署网络
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
配置kubectl配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
单 master 的集群安装步骤就到这里了。
启动一个服务
# 安装一个nginx服务,暴露端口80,副本数为1个
kubectl run nginx-deployment --image=nginx --port=80 --replicas=1
# 因为集群在一个扁平化的网络环境中,所以可以直接访问nginx的IP地址
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-8859878f8-j7z2f 1/1 Running 0 17s 10.244.1.2 k8s-node1 <none> <none>
$ curl 10.244.1.2 --head
HTTP/1.1 200 OK
Server: nginx/1.21.3
Date: Fri, 10 Sep 2021 10:15:12 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 07 Sep 2021 15:21:03 GMT
Connection: keep-alive
ETag: "6137835f-267"
Accept-Ranges: byte
# 给nginx 扩容
$ kubectl scale --replicas=3 deployment/nginx-deployment
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-8859878f8-65v66 1/1 Running 0 8s
nginx-deployment-8859878f8-j7z2f 1/1 Running 0 6m37s
nginx-deployment-8859878f8-q5n9r 1/1 Running 0 8s
# 给deployment 创建svc 端口80000,容器端口80
kubectl expose deployment nginx-deployment --port=80000 --target-port=80
# 这样就有专门的svc负责调度工作了。使用的是ipvsadm来调度的。比iptables调度要高效很多;
# 给svc做外网映射,使其可以通过外网访问
kubectl edit svc nginx-deployment
# 修改如下:
ClusterIP 修改为:NodePort
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h8m
nginx-deployment NodePort 10.108.129.58 <none> 30000:31628/TCP 11m
# 这样通过外网地址加31628就可以访问pod了;
curl http://18.162.119.95:31628/
kubernetes 资源清单
k8s中的资源
-
名称空间级别
-
工作负载型资源(workload):Pod、ReplicaSet、Deployment、statefulSet、Daemonset、Job、CronJob(ReplicationController在v1.11版本被废弃) 服务发现及负载均衡型资源(ServiceDiscovery LoadBalance):Service、Ingress、。。。 配置与存储型资源:Volume(存储卷)、CSI(容器存储接口,可以扩展各种各样的第三方存储卷) 特殊类型的存储卷:ConfigMap(当配置中心来使用的资源类型)、Secret(保存敏感信息)、DownwardAPI(把外部环境中的信息输出给容器)
-
-
集群级别
- role
-
元数据级别
- HPA
资源清单
成功那用字段解释说明
容器生命周期
本文来自博客园, 作者:Star-Hitian, 转载请注明原文链接:https://www.cnblogs.com/Star-Haitian/articles/15292289.html

浙公网安备 33010602011771号