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

注意

如果安装失败;

加入主节点

# 执行安装日志中的加入命令即可,类似这样的:
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

资源清单

成功那用字段解释说明

容器生命周期

posted @ 2021-09-16 10:01  Star-Hitian  阅读(86)  评论(0)    收藏  举报