ubuntu18.04安装 kubernetes1.20.0+crio1.20.0部署,此处为安转的一个实验节点,集群安装请参考集群前期准备iptables,ipvs
官网链接
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#cri-o
1、安装以及配置的先决条件:
-
配置主机名
hostnamectl set-hostname my
-
关闭交换空间
swapoff -a
注释 swap 开头的行
vi /etc/fstab
-
关闭防火墙
ufw disable -
同步时间
dpkg-reconfigure tzdata
选择 Asia(亚洲)
选择 Shanghai(上海)
-
安装 ntpdate
apt-get update
apt-get install ntpdate -
设置系统时间与网络时间同步(cn.pool.ntp.org 位于中国的公共 NTP 服务器)
ntpdate cn.pool.ntp.org
-
将系统时间写入硬件时间
hwclock --systohc
-
配置静态网卡
vi /etc/netplan/50-cloud-init.yaml
network:
ethernets:
ens33:
dhcp4: false
dhcp6: false
addresses: [192.168.12.51/24]
optional: true
gateway4: 192.168.12.51
nameservers:
addresses: [192.168.12.1]
version: 2
#保存刷新网卡, netplan apply
- 修改hosts文件
cat >> /etc/hosts << EOF
192.168.12.51 my
EOF
- iptables桥接流量
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
2、安装cri-o cri-o-runc,这里选择ubuntu18.04为例,更多平台参考上面给出的链接
在下列操作系统上安装 CRI-O, 使用下表中合适的值设置环境变量 OS:
操作系统 | $OS |
---|---|
Ubuntu 20.04 | xUbuntu_20.04 |
Ubuntu 19.10 | xUbuntu_19.10 |
Ubuntu 19.04 | xUbuntu_19.04 |
Ubuntu 18.04 | xUbuntu_18.04 |
然后,将 $VERSION 设置为与你的 Kubernetes 相匹配的 CRI-O 版本。 例如,如果你要安装 CRI-O 1.18, 请设置 VERSION=1.18. 你也可以安装一个特定的发行版本。 例如要安装 1.18.3 版本,设置 VERSION=1.18:1.18.3 。
注:目前只能下载1.20.0的crio和runc,1.20.1官网目前没资源
然后执行,
cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /
EOF
cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:1.20.list
deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.20/xUbuntu_18.04/ /
EOF
链接下载不了可手动在浏览器打开查看是否有资源,上面添加源也是如此
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/Release.key | sudo apt-key add --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.20/xUbuntu_18.04/Release.key | sudo apt-key add --keyring /etc/apt/trusted.gpg.d/libcontainers-cri-o.gpg -
sudo apt-get update
sudo apt-get install cri-o cri-o-runc
安装crictl 1.20.0工具,具备docker基本一些命令
github地址:https://github.com/kubernetes-sigs/cri-tools,
下载1.20.0版本
https://github.com/kubernetes-sigs/cri-tools/releases
删除安装crio自带的crictl工具,目录为 cd /usr/bin/crictl,解压新版本放入到 /usr/bin/ 即可
验证 crictl -version
输出如下
root@my:~# crictl -version
crictl version v1.20.0
验证 crictl --runtime-endpoint unix:///var/run/crio/crio.sock version
输出如下
Version: 0.1.0
RuntimeName: cri-o
RuntimeVersion: 1.20.0
RuntimeApiVersion: v1alpha1
crictl配置crio运行时路径,默认已存在配置,如没有可增加
vi /etc/crictl.yaml
内容如下
runtime-endpoint: "unix:///var/run/crio/crio.sock"
image-endpoint: "unix:///var/run/crio/crio.sock"
timeout: 0
debug: false
pull-image-on-create: true
disable-pull-on-run: false
配置crio默认拉取镜像地址
vi /etc/crio/crio.conf
1、搜索内容 /registry ,放开下面注释加入内容,此为阿里云用户容器加速链接,可自行申请
注:目前发现不支持协议前缀https,改成abc.com:443
注:阿里云仓库需要增加/library
registries = ['4v2510z7.mirror.aliyuncs.com:443/library']
或者
registries = [
'4v2510z7.mirror.aliyuncs.com/' , 'docker.io'
]
2、搜索内容 /pause_image
pause_image = "registry.aliyuncs.com/google_containers/pause:3.2"
启动 CRI-O:
sudo systemctl daemon-reload
sudo systemctl start crio
sudo systemctl restart crio #重启
3、安装kubeadm、kubectl、kbelet
安装 kubeadm,kubelet,kubectl
安装系统工具
apt-get update && apt-get install -y apt-transport-https
安装 GPG 证书
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
写入软件源;文件不存在新建
cat << EOF >/etc/apt/sources.list.d/kubernetes.list
> deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
> EOF
更新数据源
apt-get update
安装k8s指定版本号
apt-get install -y kubelet=1.20.0-00 kubeadm=1.20.0-00 kubectl=1.20.0-00
4、导出kubeadm创建环境文件
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
需要修改内容已加注释如下
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
#当前节点ip或者hostname
advertiseAddress: 192.168.8.51
bindPort: 6443
nodeRegistration:
#criSocket: unix:///var/run/dockershim.sock
#重点修改为crio运行时
criSocket: unix:///var/run/crio/crio.sock
name: my
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
#配置阿里云k8s仓库
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
# 开启 IPVS 模式
#apiVersion: kubeproxy.config.k8s.io/v1alpha1
#kind: KubeProxyConfiguration
#featureGates:
# SupportIPVSProxyMode: true
#mode: ipvs
查看所需镜像列表
kubeadm config images list --config kubeadm.yml
拉取镜像
kubeadm config images pull --config kubeadm.yml
5、根据配置文件启动kubeadm拉起k8s
--v=6 查看日志级别,一个节点可以忽略该参数 --upload-certs
kubeadm init --config=./kubeadm.yml --upload-certs --v=6
6、配置 kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
7、验证是否成功
kubectl get node
输出如下
root@my:/usr/local/kubernetes# kubectl get node
NAME STATUS ROLES AGE VERSION
my Ready control-plane,master 17m v1.20.0
8、查看kubectl get cs状态
root@my:/usr/local/kubernetes# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
注:可能遇到检查状态不ok,编辑如下路径配置
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
vim /etc/kubernetes/manifests/kube-scheduler.yaml
把这一行内容注释,等待集群自动加载配置,需要时间
# - --port=0 ## 注释掉这行
让我们回顾下启动kubeadm的日志,其中有一段如下,即状态检查错误产生的原因
I0112 11:16:30.608300 57110 round_trippers.go:445] GET https://192.168.8.51:6443/healthz?timeout=10s in 0 milliseconds
I0112 11:16:35.933347 57110 round_trippers.go:445] GET https://192.168.8.51:6443/healthz?timeout=10s 500 Internal Server Error in 4825 milliseconds
I0112 11:16:36.157573 57110 round_trippers.go:445] GET https://192.168.8.51:6443/healthz?timeout=10s 500 Internal Server Error in 49 milliseconds
9、驱逐master污点,让master具有可调度pod到master节点上运行
root@my:/# kubectl taint nodes --all node-role.kubernetes.io/master-
输出如下
node/my untainted
10、部署nginx验证k8s是否可用
#对应应用的期望是什么
apiVersion: apps/v1
#资源类型为控制器类型
kind: Deployment
#元数据
metadata:
#应用名称
name: myapp
#所在命名空间
namespace: default
#应用标签,可组合多个
labels:
app: myapp
#对应应用的期望是什么
spec:
#副本数为2
replicas: 1
#设置滚动升级保存多少个历史revision版本
revisionHistoryLimit: 3
#标签选择器-如何让应用于pod关联:myapp通过查找app: myapp的标签pod然后查找容器app: myapp进行关联
selector:
#通过标签匹配
matchLabels:
#供selector选择,保持一致(deployment通过该label找到pod)
app: myapp
#POD使用模板
template:
#pod的标签
metadata:
labels:
app: myapp
#pod中所包含的容器
spec:
#容器列表
containers:
#容器信息:名称、使用镜像、拉取策略
- name: myapp
image: nginx
#实际生产过程中,我们希望每次都去重新下载:Always、Nerver
imagePullPolicy: IfNotPresent
#容器内部端口
ports:
- containerPort: 80
resources:
#指定容器请求
requests:
memory: "1000Mi"
cpu: "500m"
#指定容器限制
limits:
memory: "1000Mi"
cpu: "500m"
---
#注册服务
#API 版本号
apiVersion: v1
kind: Service
#元数据
metadata:
#Kind 的名称
name: myapp
labels:
app: myapp
spec:
#暴露端口
ports:
#Service 暴露的端口
- port: 80
#Pod 上的端口,这里是将 Service 暴露的端口转发到 Pod 端口上
targetPort: 80
#node暴露端口范围:30000-32767
nodePort: 30001
#类型的ClusterIP,LoadBalancer,none(无头服务)
#type: LoadBalancer
type: NodePort
# 标签选择器
selector:
# 需要和上面部署的label app=myapp Deployment 标签名对应
app: myapp
使用ip:30001访问,可以看到nginx欢迎页即成功。