Kubernetes安装前准备
概述
集群节点为 1主 2从模式,
OS:ubuntu server
CPU: 最低 1CPU 2 核
内存:最低2G
硬盘:最低20G
节点配置
主机名 | IP | 角色 | 系统 | CPU/内存 | 磁盘 |
kubernetes-master | 192.168.6.201 | Mater | ubuntu | 2核2G | 20G |
kubernetes-node-01 | 192.168.6.210 | Node | ubuntu | 2核4G | 20G |
kubernetes-node-02 | 192.168.6.211 | Node | ubuntu | 2核4G | 20G |
统一环境配置
安装完一台kubernetes服务器,直接用镜像
关闭交换空间
swapoff -a
永久禁用Swap
# 把根目录文件系统设为可读写
sudo mount -n -o remount,rw /
# 用vi修改/etc/fstab文件,在swap分区这行前加 # 禁用掉,保存退出
vi /etc/fstab
#swap.img
# 使用free -m查看分区状态
reboot
sudo free -m
避免开机启动交换空间
新版本可能没有
vi /etc/fatab
## 注释swap开头的行
#swap.img
关闭防火墙
ufw disable
配置DNS
vi /etc/systemd/resolved.conf
取消DNS注释行,并添加114.114.114.114
修改后重启计算机!!!
安装Docker
apt-get update
apt install docker.io
配置镜像加速器
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
sudo systemctl daemon-reload
sudo systemctl restart docker.service
安装kubernetes必备工具
kubeadm:用来初始化集群的指令。
kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl:用来与集群通信的命令行工具。
# 安装系统工具
apt-get update && apt-get install -y apt-transport-https
# 因为kubernetes在国外,所以要使用aliyun 镜像
# 安装GPG 证书
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 更新缓存索引
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" >>/etc/apt/sources.list.d/kubernetes.list
# 写入软件源
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
#安装
sudo apt-get update
# sudo apt-get install -y kubelet kubeadm kubectl //最新版本安装 1.26 有问题
#指定版本安装
apt-get install -y kubelet=1.25.0-00
apt-get install -y kubeadm=1.25.0-00
apt-get install -y kubectl=1.25.0-00
sudo apt-mark hold kubelet kubeadm kubectl
同步时间
设置时区
dpkg-reconfigure tzdata
选择Asia - Shanghai
#安装 nptdate
apt-get install ntpdate
# 设置系统时间与网络时间同步(cn.pool.ntp.org 位于中国公共的NTP 服务器)
ntpdate cn.pool.ntp.org
# 将系统时间写入硬件时间
hwclock --systohc
确认时间
date
修改cloud.cfg
防止重启后主机名还原
vi /etc/cloud/cloud.cfg
preserver_hostname: true
修改主机名
hostnamectl set-hostname deployment
#配置 hosts
cat >> /etc/hosts <<EOF
192.168.141.130 deployment
EOF
设置允许远程登陆root
vi /etc/ssh/sshd_config
# Authentication:
LoginGraceTime 120
#PermitRootLogin without-password // 注释此行
PermitRootLogin yes // 加入此行
StrictModes yes
#PermitEmptyPasswords yes // 允许密码登陆
#重启服务
service ssh restart
修改ip地址
查看ip地址 ifconfig
查看网关 route -n
vi /etc/netplan/50-cloud-init.yaml 或者为00-installer-config.yaml
network:
ethernets:
ens33:
addresses: [192.168.6.121/24] // 24代表子网掩码 255.255.255.0 24个1
gateway4: 192.168.6.1
nameservers:
addresses: [192.168.6.1]
network:
ethernets:
ens33:
dhcp4: true
version: 2
gateway4 弃用
network:
ethernets:
ens33:
addresses: [192.168.31.210/24]
routes:
- to: default
via: 192.168.31.1
nameservers:
addresses: [192.168.31.1]
修改DNS
# 取消DNS 注释行,并增加DNS配置如 114.114.114.114 并重启reboot
vi /etc/systemd/resolved.conf
配置生效
sudo netplan apply
reboot
Kubernetes安装集群
kubeadm 安装集群
创建并修改配置
cd /usr/local
mkdir kubernetes
mkdir cluster
# 导出配置文件
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
更改
1.localAPIEndpoint:
advertiseAddress: 192.168.6.110
2.imageRepository: registry.aliyuncs.com/google_containers // google上不去改成此地址
3.kubernetesVersion: v1.25.0 //改为具体版本
4.networking:
dnsDomain: cluster.local
#配置 POD 所在网段为虚拟机不重叠的网段(这里用的是Flannel 默认网段)
podSubnet: "10.244.0.0/16" //加入
serviceSubnet: 10.96.0.0/12
scheduler: {}
查看所需镜像
kubeadm config images list --config kubeadm.yml
拉取所需镜像
kubeadm config images pull --config kubeadm.yml
kubeadm.yml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.6.201
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: node
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.25.0
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}
安装主节点
用v1.25 没有大问题
如果安装kubernetes版本和下载的镜像版本不统一则会出现timeout waiting for the condition。可以通过kubeadm reset重置,然后再init
#初始化
kubeadm init --config=kubeadm.yml --experimental-upload-certs | tee kubeadm-init.log
1.16 以后版本新命令
#输出token 到kubeadm-init.log
kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log
初始化完成后,还需要按照步骤运行操作
踩坑的点
安装过程可能出现kubeadm init初始化时dial tcp 127.0.0.1:10248: connect: connection refused
一定要记得 swapoff -a !!!!
vi /etc/docker/daemon.json
添加
{"exec-opts": ["native.cgroupdriver=systemd"]}
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
增加 --cgroup-driver=systemd
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
# 直到systemctl status kubelet.service 为active才行
sudo kubeadm reset
kubelet 起不起来问题
# 查看启动日志
journalctl -f -u kubelet
问题点:
1.k8s 版本确认 apt list --installed | grep kube
2.开启docker-service systemctl enable docker.service
3.kubeadm.yml 配置文件的版本 由于阿里云镜像没有1.18.5 所有使用v1.18.0
4.内存够由2G 升为4G 需要重新配置交换空间 swapoff -a
安装从节点
从节点也必须安装好 kubelet 、 kubeadm、kubectl
从节点重置 kubeadm reset
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.6.201:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:192fbbefceb0c41b728ec932271710d44c3b9c79e5c571b94cdf59d41ccbb9f8
token 过期
# kubeadm token create
424mp7.nkxx07p940mkl2nd
# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
d88fb55cb1bd659023b11e61052b39bbfe99842b0636574a16c76df186fd5e0d
kubeadm join 192.168.6.201:6443 --token 95jszr.4k2b04ugzrmuuj5o --discovery-token-ca-cert-hash sha256:9feb5bf152cea193e41ff0e6191b9fff8ca9b5b63a2bdafae64c79d71769c186
安装完主节点后,会有log提示如何安装从节点
另外服务器上运行即可
kubectl get nodes查看节点状态
![](https://img-blog.csdnimg.cn/img_convert/1cb0bedb9d3cf75b03fb1aa0c1b50dbd.png)
NAME STATUS ROLES AGE VERSION
kubernetes-node-01 NotReady <none> 117m v1.25.0
kubernetes-node-02 NotReady <none> 114m v1.25.0
node NotReady control-plane 18h v1.25.0
NotReady 是因为还没有配置网络
#后续添加节点生产token,复制粘贴直接可以追加节点
kubeadm token create --print-join-command
# 这个token有效期为1天,可以生产永久token
kubeadm token create --ttl 0
kubernetes配置网络
docker默认 为容器配置以下网络:
none
host
default bridge
自定义网桥
CNI: 容器网络接口(Container Network Interface)
由Google和Core OS主导制定的容器网络标准,它仅仅是一个接口,具体的功能由各个网络插件自己去实现:
创建容器网络空间(network namespace)
将网络接口(interface)放到对应的网络空间
为网络接口分配IP等
容器删除时,回收网络资源
将所有的k8s Pod通过CNI 联系起来
CNI 插件
Flannel
Calico
Canal
Weave
安装网络插件Calico
Calico是一个开源网络和网络安全解决方案,适用于容器、虚拟机和基于本地主机的工作负载。Calico支持多种平台,包括Kubernetes、OpenShift、Mirantis Kubernetes Engine(MKE)、OpenStack和裸机服务。
无论您是选择使用Calico的eBPF数据平面还是使用Linux的标准网络管道,Calico都能提供超快的性能和真正的云本地可伸缩性。Calico为开发人员和群集运营商提供了一致的体验和功能集,无论它们是在公共云或本地运行、在单个节点上运行,还是在数千个节点的群集中运行。
官网:https://projectcalico.docs.tigera.io/getting-started/kubernetes/self-managed-onprem/onpremises
## dowload
curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml -O
kubectl apply -f calico.yaml
###Confirm that all of the pods are running with the following command.
watch kubectl get pods -n calico-system
#确认状态
kubectl get node
kubernetes第一个容器
service 负责服务,应用的抽象
deployment 负责部署object(对象)
pod 允许容器的最小单元,类似于容器
检查组件运行状态
kubectl get cs
检查Master状态
kubectl cluster-info
检查Nodes状态
kubectl get nodes
运行第一个容器实例
--port=80 80端口在k8s的内网端口
# 使用kubectl 命令创建两个监听 80 端口 的Nginx Pod
(弃用)kubectl run nginx --image=nginx --replicas=2 --port=80
#1.8 之后弃用了replicas 推荐使用deployment创建pods
# 先创建namespace
kubectl create ns dev
# 再启动
kubectl create deployment nginx --image=nginx --port=80 --replicas=2
# 默认会使用default namespace 如果起不来加上 -n dev
显示 deployment.apps/nginx created
查看全部pods状态
kubectl get pods
kubectl get deployment
暴露服务
部署完之后,还需要暴露出service 服务
80 只是在k8s的内网的端口,还需要暴露服务,会生成30797 这种暴露在外的端口
expose 暴露一个 名叫nginx 的deployment,端口号80,类型 负载均衡
#启动
kubectl expose deployment nginx --port=80 --type=LoadBalancer
查看已发布的服务
kubectl get service
查看服务详情
kubectl describe service nginx
验证是否成功
通过浏览器访问Node 节点服务器,负载均衡方式即为成功
http://192.168.6.210:31952/
http://192.168.6.211:31952/
停止服务
使用docker 并不能删除已开启的服务,因为高可用,会无限创建pods
删除已部署的服务
kubectl delete deployment nginx
删除已发布的服务
kubectl delete service nginx
查看所有的部署
kubectl get deployment