01.集群规划

系统版本:CentOS Linux release 7.6.1810 (Core)

软件版本:kubeadm、kubernetes-1.15、docker-ce-18.09

硬件要求:最少需要2GB或者以上的内存,最少需要2核或者以上更多的CPU

参考官方文档:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

主机名 主机地址 主机角色 运行服务
k8s-master 172.16.254.134 control-plane(master) kube-apiserver
etcd
kube-scheduler
kube-controller-manager
docker
kubelet
k8s-ndoe01 172.16.254.135 woker node(node) kubelet
kube-proxy
docker

02.配置主机

我们需要在主机上配置以下操作:

  • 主机名
  • 名称解析
  • 关闭SWAP交换内存
  • 关闭防火墙和SeLinux
  • 启用bridge-nf功能
  • 检查集群中每个主机的Mac地址和ProductUUID唯一性
  • 检查可用端口是否被占用
主机 协议 运行服务 所需端口
Master TCP api-server
etcd-server-client-api
kubelet-api
kube-scheduler
kube-controlle-manager
6443*
2379-2380
10250
10251
10252
Node TCP kubelet-api
nodeport-services**
10250
30000-32767

为啥要启用bridge-nf?

答:默认情况下iptables不对二层帧数据做任何处理,为了使Pod进行网络通信时也可以受到IPtables链上的规则所影响,所以我们需要开启IPtables的网桥透明工作模式,即来自二层的流量也将会被IPtables所过滤,避免出现IPtables被绕过而导致Pod流量路由不正确的问题。

主机(172.16.254.134)(k8s-master)上操作:

[root@localhost ~]# echo "k8s-master" >/etc/hostname
[root@localhost ~]# cat /etc/hostname |xargs hostname
[root@localhost ~]# bash
[root@k8s-master ~]# vim /etc/hosts
172.16.254.134 k8s-master
172.16.254.135 k8s-node01
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# systemctl stop firewalld
[root@k8s-master ~]# systemctl disable firewalld
[root@k8s-master ~]# setenforce 0
[root@k8s-master ~]# sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux
[root@k8s-master ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@k8s-master ~]# sysctl --system
[root@k8s-master ~]# ip link |grep 'link/ether'
link/ether 00:0c:29:d1:7c:b1 brd ff:ff:ff:ff:ff:ff
[root@k8s-master ~]# cat /sys/class/dmi/id/product_uuid
8A2E4D56-EE76-A6CE-0E12-70F4B8D17CB1
[root@k8s-master ~]# netstat -lnupt

主机(172.16.254.135)(k8s-node01)上操作

[root@localhost ~]# echo "k8s-node01" >/etc/hostname
[root@localhost ~]# cat /etc/hostname |xargs hostname
[root@localhost ~]# bash
[root@k8s-node01 ~]#
[root@k8s-node01 ~]# vim /etc/hosts
172.16.254.134 k8s-master
172.16.254.135 k8s-node01
[root@k8s-node01 ~]# swapoff -a
[root@k8s-node01 ~]# systemctl stop firewalld
[root@k8s-node01 ~]# systemctl disable firewalld
[root@k8s-node01 ~]# setenforce 0
[root@k8s-node01 ~]# sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux
[root@k8s-node01 ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@k8s-node01 ~]# ip link |grep 'link/ether'
link/ether 00:0c:29:6d:40:2b brd ff:ff:ff:ff:ff:ff
[root@k8s-node01 ~]# cat /sys/class/dmi/id/product_uuid
4D854D56-E60A-69DD-CC05-4BF03A6D402B
[root@k8s-node01 ~]# netstat -lnupt

03.部署容器运行平台(docker)

1、安装Docker

两台主机上操作相同!

[root@localhost ~]# yum -y install epel-release.noarch yum-utils
[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]# yum -y install device-mapper-persistent-data lvm2
[root@localhost ~]# yum -y install docker-ce-18.09.1
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker

2、配置Docker,重启Docker服务

配置Docker在线镜像源为国内镜像源,配置Docker使用的cgroup驱动为"systemd"。

两台主机上操作相同。

[root@k8s-master ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
[root@k8s-master ~]# systemctl restart docker

04.安装相关组件(kubelet、kubeadm、kubectl)

kubeadm,引导构建集群所使用的工具。

kubelet,在集群中所有机器上要运行的组件,用于管理Pod和容器。

kubectl,在命令行操作和使用集群的客户端工具。

在所有主机上:

[root@k8s-master ~]# cat <<EOF >/etc/yum.repos.d/kubernetes.repo
[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
[root@k8s-master ~]# yum install -y kubelet-1.15.0 kubelet-1.15.0 --disableexcludes=kubernetes --nogpgcheck
[root@k8s-master ~]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
[root@k8s-master ~]# systemctl enable kubelet

在Kubernetes中,客户端与APIServer通信需要使用X509证书,各组件之间也是使用证书进行身份验证的,由于官方默认使用kubeadm创建的相关证书有效期只有一年,如果证书到期后可能导致集群不可用,这非常严重。所以我们可以对kubeadm进行修改后重新编译此命令,以使用kubeadm创建的证书有效期更长,这里我将其增加到了200年。步骤如下:

[root@k8s-master ~]# yum -y install git golang
### GO设置国内镜像源
[root@k8s-master ~]# export GO111MODULE=auto
[root@k8s-master ~]# export GOPROXY=https://goproxy.cn
### 从GITHUB克隆官方代码
[root@k8s-master ~]# git clone https://github.com/kubernetes/kubernetes.git
[root@k8s-master ~]# cd kubernetes
[root@k8s-master kubernetes]# git tag -l
...
v1.15.0
...
[root@k8s-master01 kubernetes]# git checkout -b v1.15.0 v1.15.0
### 修改证书有效期相关代码
[root@k8s-master01 kubernetes]# vim cmd/kubeadm/app/util/pkiutil/pki_helpers.go
import (
...
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
...
)
...
// NewSignedCert creates a signed certificate using the given CA certificate and key
func NewSignedCert(cfg *certutil.Config, key crypto.Signer, caCert *x509.Certificate, caKey crypto.Signer) (*x509.Certificate, error) {
...
certTmpl := x509.Certificate{
Subject: pkix.Name{
CommonName: cfg.CommonName,
Organization: cfg.Organization,
},
DNSNames: cfg.AltNames.DNSNames,
IPAddresses: cfg.AltNames.IPs,
SerialNumber: serial,
NotBefore: caCert.NotBefore,
NotAfter: time.Now().Add(kubeadmconstants.CertificateValidity).UTC(),
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
ExtKeyUsage: cfg.Usages,
}
...
} [root@k8s-master kubernetes]# vim cmd/kubeadm/app/constants/constants.go
const (
...
// CertificateValidity defines the validity for all the signed certificates generated by kubeadm
// CertificateValidity = time.Hour * 24 * 365
CertificateValidity = time.Hour * 24 * 365 * 200
...
}
### 编译生成kubeadm软件
[root@k8s-master kubernetes]# cd cmd/kubeadm && go build
### 拷贝软件到系统命令目录
[root@k8s-master kubeadm]# cp -rf kubeadm /usr/bin/

05.构建集群

1、查看使用Kubeadm创建Kubernetes集群所需要的Docker镜像

由于Kubeadm默认使用的在线镜像源地址是"k8s.gcr.io"。所以我们需要手动下载所需镜像才能去创建集群。

主机(k8s-master)上操作!

[root@k8s-master ~]# kubeadm config print init-defaults |grep imageRepository
imageRepository: k8s.gcr.io
[root@k8s-master ~]# kubeadm config images list
W0708 15:58:04.237960 23951 version.go:99] falling back to the local client version: v1.15.0
k8s.gcr.io/kube-apiserver:v1.15.0
k8s.gcr.io/kube-controller-manager:v1.15.0
k8s.gcr.io/kube-scheduler:v1.15.0
k8s.gcr.io/kube-proxy:v1.15.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

2、手动从第三方存储库下载镜像,并重新标记

我们可以先从在线的镜像源中搜索一下。

两台主机上操作相同!

[root@k8s-master ~]# docker search kube-apiserver:v1.15.0
[root@k8s-master ~]# docker search richarddockerimage
NAME DESCRIPTION STARS
richarddockerimage/kube-apiserver-v15 k8s.gcr.io/kube-apiserver:v1.15.0 0
richarddockerimage/tomcat_env_image Based on ubuntu 14.04, plus java7 and tomcat… 0
richarddockerimage/docker-whale Demo for docker 0
richarddockerimage/kube-controller-manager-v15 k8s.gcr.io/kube-controller-manager:v1.15.0 0
richarddockerimage/kube-proxy-v15 k8s.gcr.io/kube-proxy:v1.15.0 0
richarddockerimage/kube-scheduler-v15 k8s.gcr.io/kube-scheduler:v1.15.0 0
richarddockerimage/coredns-v15 k8s.gcr.io/coredns:1.3.1 0
richarddockerimage/etcd k8s.gcr.io/etcd:3.3.10 0
richarddockerimage/pause-v15 k8s.gcr.io/pause:3.1 0
richarddockerimage/oracle12 Oracle database 12 0
richarddockerimage/sqlserver sql server 2017 0
richarddockerimage/image_from_dockerfile 0
[root@k8s-master ~]# docker pull richarddockerimage/kube-apiserver-v15
[root@k8s-master ~]# docker pull richarddockerimage/kube-controller-manager-v15
[root@k8s-master ~]# docker pull richarddockerimage/kube-scheduler-v15
[root@k8s-master ~]# docker pull richarddockerimage/kube-proxy-v15
[root@k8s-master ~]# docker pull richarddockerimage/pause-v15
[root@k8s-master ~]# docker pull richarddockerimage/etcd
[root@k8s-master ~]# docker pull richarddockerimage/coredns-v15
[root@k8s-master ~]# docker tag richarddockerimage/kube-apiserver-v15 k8s.gcr.io/kube-apiserver:v1.15.0
[root@k8s-master ~]# docker tag richarddockerimage/kube-controller-manager-v15 k8s.gcr.io/kube-controller-manager:v1.15.0
[root@k8s-master ~]# docker tag richarddockerimage/kube-scheduler-v15 k8s.gcr.io/kube-scheduler:v1.15.0
[root@k8s-master ~]# docker tag richarddockerimage/kube-proxy-v15 k8s.gcr.io/kube-proxy:v1.15.0
[root@k8s-master ~]# docker tag richarddockerimage/pause-v15 k8s.gcr.io/pause:3.1
[root@k8s-master ~]# docker tag richarddockerimage/etcd k8s.gcr.io/etcd:3.3.10
[root@k8s-master ~]# docker tag richarddockerimage/coredns-v15 k8s.gcr.io/coredns:1.3.1
[root@k8s-master ~]# docker rmi richarddockerimage/kube-apiserver-v15
[root@k8s-master ~]# docker rmi richarddockerimage/kube-controller-manager-v15
[root@k8s-master ~]# docker rmi richarddockerimage/kube-scheduler-v15
[root@k8s-master ~]# docker rmi richarddockerimage/kube-proxy-v15
[root@k8s-master ~]# docker rmi richarddockerimage/pause-v15
[root@k8s-master ~]# docker rmi richarddockerimage/etcd
[root@k8s-master ~]# docker rmi richarddockerimage/coredns-v15
[root@k8s-master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/etcd 3.3.10 aae65e9fad13 9 days ago 258MB
k8s.gcr.io/coredns 1.3.1 12dcba476018 9 days ago 40.3MB
k8s.gcr.io/pause 3.1 f3120a7daf47 9 days ago 742kB
k8s.gcr.io/kube-proxy v1.15.0 b39aca5c3855 9 days ago 82.4MB
k8s.gcr.io/kube-scheduler v1.15.0 9270c92a5165 9 days ago 81.1MB
k8s.gcr.io/kube-controller-manager v1.15.0 79939977718a 9 days ago 159MB
k8s.gcr.io/kube-apiserver v1.15.0 6ea465931092 9 days ago 207MB

3、创建一个Kubernetes集群

主机(k8s-master)上操作!

使用以下命令将会在主机上自动安装并运行控制平面(Master)组件服务。

[root@k8s-master ~]# kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=0.0.0.0 --ignore-preflight-errors=Swap
Your Kubernetes control-plane has initialized successfully!
你的Kubernetes 控制平面节点(Master)安装成功! 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 You should now deploy a pod network to the cluster.
你现在需要向集群中部署一个Pod网络。
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
你可以通过下面链接中的帮助文档,安装一个适用的网络插件用于Pod网络通信。
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:
你可以运行以下命令将任意Node节点的加入到Kubernetes集群中。
kubeadm join 172.16.254.134:6443 --token c4p317.ia0w2uc6m1f4pmnn \
--discovery-token-ca-cert-hash sha256:ef2c778a8d7c6c2df000449249f45f55bf35356239fdaefa84822fde4b2f4b71

4、拷贝kubectl的配置文件

主机(k8s-master)上操作!

集群创建完成后,我们需要使用"kubectl"客户端连接管理集群,kubectl使用生成的配置文件连接并管理操作集群,源配置文件路径:/etc/kubernetes/admin.conf。

[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

5、部署网络插件(flannel)

主机(k8s-master)上操作!

Kubenetes中Pod之间网络通信通过第三方扩展来实现的,所以我们需要安装第三方网络插件,flannel是常用的网络插件,当然可以选择其他,请参考官方文档。

安装完成后我们使用"kubectl get pods --all-namespaces"命令查看下"kube-system"这个名称空间下的Pod运行情况,发现都是"Running"运行状态,说明Kubernetes集群已正常工作了。

[root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml
[root@k8s-master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5c98db65d4-sj2j6 1/1 Running 0 93m
kube-system coredns-5c98db65d4-zhpdw 1/1 Running 0 93m
kube-system etcd-k8s-master 1/1 Running 0 92m
kube-system kube-apiserver-k8s-master 1/1 Running 0 92m
kube-system kube-controller-manager-k8s-master 1/1 Running 0 92m
kube-system kube-flannel-ds-amd64-22fnl 1/1 Running 0 12m
kube-system kube-proxy-dlxwl 1/1 Running 0 93m
kube-system kube-proxy-mtplf 1/1 Running 0 100s
kube-system kube-scheduler-k8s-master 1/1 Running 0 92m

6、将Node节点主机加入到集群中

主机(k8s-Node01)上操作!

默认情况下,在创建的集群的时候,就会创建一个Token和CA证书,用于Node节点连接并接入到集群中,令牌的过期时间默认是24小时,当超过这个时间,如果还需要Node节点加入到集群中的话,则我们需要手动创建Token和CA证书。

[root@k8s-master ~]# kubeadm token list
[root@k8s-master ~]# kubeadm token create
[root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
[root@k8s-node01 ~]# kubeadm join 172.16.254.134:6443 --token c4p317.ia0w2uc6m1f4pmnn --discovery-token-ca-cert-hash sha256:ef2c778a8d7c6c2df000449249f45f55bf35356239fdaefa84822fde4b2f4b71 --ignore-preflight-errors=Swap
This node has joined the cluster:
这个节点已加入到集群中:
* Certificate signing request was sent to apiserver and a response was received.
证书签名请求已发送到API Server,并接受到响应。
* The Kubelet was informed of the new secure connection details.
Kubelet被告知新的安全连接细节。 Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
在控制平面上运行这个命令"kubectl get nodes"可以看到这个节点已加入到集群中。

06.查看集群

1、查看集群中节点情况

主机(k8s-master)上操作。

我们已经看到集群已经构建完成!Master和Node节点处于就绪状态。

[root@k8s-master ~]#  kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 95m v1.15.0
k8s-node01 Ready <none> 2m57s v1.15.0

2、查看控制平面(Master)节点组件运行情况

[root@k8s-master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}

3、查看集群状态信息

[root@k8s-master ~]# kubectl cluster-info
Kubernetes master is running at https://172.16.254.134:6443
KubeDNS is running at https://172.16.254.134:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

4、查看集群版本

[root@k8s-master ~]# kubectl version --short=true
Client Version: v1.15.0
Server Version: v1.15.0

07.简单使用

在集群中创建一个Pod,验证是否可正常运行!

1、创建Deployment

创建Deployment(Pod控制器),即会自动创建并调度Pod在Node上运行起来。

创建Pod后,Kubernetes会自动在Docker上基于镜像运行起来一个容器应用。

Pod内运行Nginx应用的容器。

[root@minikube ~]# kubectl create deployment nginx --image=nginx  # 创建Deployment
[root@minikube ~]# kubectl get deployment -o wide # 查看Deployment
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 1/1 1 1 24m nginx nginx app=nginx
[root@minikube ~]# kubectl get pod -o wide # 查看Pod
NAME READY STATUS RESTARTS AGE IP NODE
nginx-554b9c67f9-7bzhw 1/1 Running 0 24m 172.17.0.2 minikube

2、创建Service

创建Service,映射容器应用暴露的端口到主机端口,映射到主机上的端口是随机分配的。

[root@minikube ~]# kubectl expose deployment nginx --port=80 --type=NodePort  # 创建Service
[root@minikube ~]# kubectl get service nginx -o wide # 查看Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx NodePort 10.96.89.7 <none> 80:32756/TCP 2m4s app=nginx

3、通过浏览器访问

访问地址:NodeIP:Port.

K8S 使用Kubeadm搭建单个Master节点的Kubernetes(K8S)~本文仅用于测试学习的更多相关文章

  1. K8S 使用Kubeadm搭建高可用Kubernetes(K8S)集群 - 证书有效期100年

    1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...

  2. kubeadm高可用master节点(三主两从)

    1.安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 五台机器,操作系统 CentOS7.5+(mini) 硬件配置:2GBRAM,2vCPU+,硬盘30GB+ 集群中所有 ...

  3. kubeadm部署多master节点高可用k8s1.16.2

    一.架构信息 系统版本:CentOS 7.6 内核:3.10.0‐1062.4.1.el7.x86_64 Kubernetes: v1.16.2 Docker­ce: 19.03 推荐硬件配置:2核4 ...

  4. 将 master 节点服务器从 k8s 集群中移除并重新加入

    背景 1 台 master 加入集群后发现忘了修改主机名,而在 k8s 集群中修改节点主机名非常麻烦,不如将 master 退出集群改名并重新加入集群(前提是用的是高可用集群). 操作步骤 ssh 登 ...

  5. 二进制部署1.23.4版本k8s集群-5-部署Master节点服务

    1.安装Docker 在21.22.200三台机器上安装Docker.安装命令: 在21.22.200三台主机上部署Docker. ~]# curl -fsSL https://get.docker. ...

  6. kubeadm高可用master节点部署文档

    kubeadm的标准部署里,etcd和master都是单节点的. 但上生产,至少得高可用. etcd的高可用,用kubeadm微微扩散一下就可以. 但master却官方没有提及. 于是搜索了几篇文档, ...

  7. 使用Kubeadm安装Kubernetes【单Master节点】

    参考:Kubernetes官方文档 Kubernetes安装方案选择    Centos 7 配置科学上网 安装Calico网络插件 kubernetes-dashboard部署 Kubernetes ...

  8. 排查 k8s 集群 master 节点无法正常工作的问题

    搭建的是 k8s 高可用集群,用了 3 台 master 节点,2 台 master 节点宕机后,仅剩的 1 台无法正常工作. 运行 kubectl get nodes 命令出现下面的错误 The c ...

  9. 【K8S】基于单Master节点安装K8S集群

    写在前面 最近在研究K8S,今天就输出部分研究成果吧,后续也会持续更新. 集群规划 IP 主机名 节点 操作系统版本 192.168.175.101 binghe101 Master CentOS 8 ...

随机推荐

  1. Kurento安装与入门02——运行示例前的准备

    官方一共提供了13个示例,这些示例运行的方式大同小异,一般会提供JAVA.Browser JavaScript.Node.js三种版本,这里仅演示java版本的示例.这些示例要求系统内已经正确安装了K ...

  2. div 底部固定方法(不用position定位)

    方法一:全局增加一个负值下边距等于底部高度 <style> html, body { height: 100%; margin: 0; } .content { padding: 20px ...

  3. ES6-11学习笔记--Map

    Map:一种新的数据结构 常用方法 遍历 应用场景 WeakMap   常用方法: let map = new Map() let obj = { name: '张三' } map.set(obj, ...

  4. Reflect.has检测对象是否拥有某个属性

    Reflect.has({x: 0}, 'x'); // true Reflect.has({x: 0}, 'y'); // false // returns true for properties ...

  5. ABP源码分析 - 服务配置(1)

    比较随意,记录下过程,以便忘了以后重拾. 三个关注点 Program.cs internal static IHostBuilder CreateHostBuilder(string[] args) ...

  6. python---替换空格

    """ 请实现一个函数,将一个字符串中的每个空格替换成"%20". 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are ...

  7. 原生的ajax请求

    原生ajax请求的步骤: get 请求: 1,创建一个xhr变量 var xhr=new XMhttpRequest(); 2,设置请求方式和请求地址 xhr.open('url','http//19 ...

  8. canvas 整个透明

          ctx.globalAlpha=.9

  9. 『忘了再学』Shell基础 — 11、变量定义的规则和分类

    目录 1.定义变量的规则 2.变量的分类 1.定义变量的规则 在定义变量时,有一些规则需要遵守 变量名称可以由字母.数字和下划线组成,但是不能以数字开头.如果变量名是2name则是错误的. 在Bash ...

  10. Mysql、Oracle锁表处理

    MySql解锁方式 1 # 1. 查看当前数据库锁表的情况 2 SELECT * FROM information_schema.INNODB_TRX; 3 # 2. 杀掉查询结果中锁表的trx_my ...