#disclaimer you can do whatever u want etc etc I have no power over you
Explore tagged Tumblr posts
genderkoolaid · 2 years ago
Text
*points a gun at you* draw trans people with bottom surgery. write trans people with bottom surgery. i am no longer asking
445 notes · View notes
twistnet · 3 years ago
Text
nsfw alphabet [ chibs telford ]
WARNINGS ─ gn!reader, smut [ oral sex, cum, kinks, masturbation ]
DISCLAIMER ─ if you are under the age of 18, do not read [ nsfw content under cut ] 
Tumblr media
a = aftercare [ what they’re like after sex ]
is one to light a cigarette the minute the act is done, patiently waiting you come down from your high and maybe, gain some feeling back in your legs again. his hands is coaxing you to even your breathing as he pulls you to rest against his chest
once he’s stamped out his cigarette, he’s pulling on a pair of briefs and walking to the washroom to get you cleaned up. if a bath and a change of sheets is needed, he’ll get that together for you and get the bedroom all squared away until you’re ready to join him once again
b = body part [ their favorite body part of theirs, and also their partner’s ]
his gentleman side would say that his favorite body part on his partner is their mind and tongue. nothing sexual about it, but he loves to hear you speak your mind, take control of the area you are in and take no shit from anyone
now, his more non-gentlemen side would say he’s a sucker for chests [ boobies or not ]. he loves laying his head there and listening to your heartbeat but also loves pressing his face right into your sternum. getting to bit and lick and mark every inch of the skin
on himself, he would say his hands. years of garage work, motorcycles, and other things have roughed them up quite a bit and he gets a small spark of joy when he gets to run his clast finger tips down any part of your exposed skin
c = cum [ anything to do with cum basically…i’m a disgusting person ]
going back to the above, on your chest. getting to paint you with his cum gets him hard all over again, and is not embarrassed to groan at the sight. oh, but you happen to swipe up some of the cum on your finger and pop it in your mouth? you might have just killed him
on the flip side, he does like cumming inside you, but likes to ask before doing so. but if given permission, loves watching it drip out of your hole. and might push some of it back in with a loving smile
d = dirty secret [ pretty self-explanatory, a dirty secret of theirs ]
playing the game that you don’t know each other at a club party, and him taking you to his dorm for a little fun time. has never said anything, but has thought about it often
e = experience [ how experienced are they? do they know what they’re doing? ]
with a previous wife and plenty of croweaters that he’s had his way with in the past, there is no denying this man has gotten around. he might try the first time to use what he’s used on croweaters before, but quickly finds that you might tick a different way and has to relearn basically everything. but don’t worry, he’ll make sure to get plenty of practice in
f = favorite position [ this goes without saying ]
missionary. standard & reverse cowgirl. doggy-style. spooning. 
g = goofy [ are they more serious in the moment, or are they humorous, etc ]
while he tends to be serious most of the time, he finds that if he can’t laugh something off like you getting a cramp midway through, or he fumbles while trying to get into a position, then the relationship won’t last
h = hair [ how well groomed are they, does the carpet match the drapes, etc ]
has truly given up on keeping groomed. use to in younger years make everything nice and clean, but has since stopped as he just doesn't want to do it anymore and regrowth is a bitch. now, he does trim so it doesn’t get too long
i = intimacy [ how are they during the moment, romantic aspect… ]
very affectionate in a private setting. pulls you in close and loves to just be able to touch you and have you surround him in anyway possible. whispering sweets words in gaelic, holding your face in his hands. that kind of thing
j = jack off [ masturbation headcanon ]
never really used his hand to get himself off, as there was always a croweater nearby to help him out and be his companion for the night. since he has started a relationship with you, he might do it more to keep himself faithful while on runs. he doesn’t do anything with the croweaters on runs, even though it’s always been something the married men have always done, he’s not one to partake
k = kink [ one or more of their kinks ]
tit-fucking ─ going back to his fascinations with chests, having the ability to run his cock against your sternum turns him on so fucking much. sometimes, he’ll do in unprompted, but sometimes, you pat your chest and he’ll quickly get into position
stockings ─ any color, any detail is fine with him. they look so pretty against your skin and are so soft. will literally buy you one in ever color. they stay on while everything else comes off.
l = location [ favorite places to do the do ]
his/ your home or in his dorm at the clubhouse. both are safe places for him and there is less room for interruptions and he can focus he’s sole attention on you
m = motivation [ what turns them on, gets them going ]
a strong confidence paired with a mouth that has no problem telling someone off or letting people know what you think. you sitting or riding with him on his bike -- also wearing his helmet. kicking ass against some of his brothers -- winning a drinking game, a round of pool, or darts. jeans that seem to hug all of your curves. leather attire of any kind. you speaking gaelic
n = no [ something they wouldn’t do, turn offs ]
sharing you with someone ─ he’s seen some of his brother indulge in something like this and  has always felt funny about it. plus, the man has a major jealous streak when prompted and that just doesn’t mix well
degradation & abuse ─ this was after having seen it during one of the porn shoots and he had to step away, not truly understanding how someone could do that to another human in a vulnerable situation
o = oral [ preference in giving or receiving, skill, etc ]
oral for him is split 50/50. in his eyes, it’s only fair if you suck him off that he return the favor.
receiving ─ he’s coaching you through it, even if you know how to do it. he loves talking to you, lightly pulling your hair away from your face or affectionately caressing your cheek or jaw. he lets you do what you want, and isn’t going to dictate what you can and cannot do. as this is just as much for him as it is for you
giving  ─ okay, so maybe i lied about the 50/50 split. to a degree. once this man gets to return the favor, it’s hard to pull him away after the first orgasm. he will continue to build you up for another one and won’t come up for breath until you’ve cum at least three times
p = pace [ are they fast and rough? slow and sensual? etc. ]
depends on the mood and can range from a rough fucking or soft lovemaking.
he isn’t fast per say, most of his thrusts are quite calculated in the sense that he knows what spots make you weak at the knees or make your spine tingle. so, while the thrusts are powerful, there is no speed to them as he doesn’t want you to come undone too quickly
soft lovemaking on the other hand is just like the above, but the power behind the thrusts is toned down. it’s still there, but it’s not as rough. he takes his time,  either letting you ride him or spooning you. this pace happens to get you to completion much later, but it is so worth it
q = quickie [ their opinions on quickies rather than proper sex, how often, etc. ]
yes, yes, and yes. quickies are frequented quite heavily in your relationship, as sometimes, that is the only way the two of you can blow of some steam. a quickie will happen before runs or when you sneak off during parties to hurry back like you weren’t gone for 20 minutes
but don’t get it confused, this man would always rather have a nice, quiet session with you over a quickie any day.
r = risk [ are they game to experiment, do they take risks, etc. ]
isn’t one to take risks without thinking through or talking about them first. sure, he likes that you are open enough to come and talk to him about what you would like to do in the bedroom, but would like to make sure that everyone is on the same page
s = stamina [ how many rounds can they go for, how long do they last… ]
two rounds max. and that goes for whatever mood and pace the two of you happen to be in. chibs doesn’t want to overexert himself or you, as sometimes just one session is enough to knock you out for the evening. 
now, this isn’t going to impact the amount of orgasms he’s going to pull from you over the course of the night. no one ever asked how long the sessions were going to last, just how many you are able to do
t = toy [ do they own toys? do they use them? on a partner or themselves? ]
was never one to use toys on partners, and had never thought for himself.
if you own toys for personal use and would like to incorporate them into the bedroom, he has no problem using them to aid in getting you off. however, he will draw the line at using them for himself, as it’s not really his thing
u = unfair [ how much do they like to tease ]
teasing is his specialty, but this man makes timed and deliberate strikes that will have to melting in his hand within a few hours. but don’t let it fool you, as he can wait for as long as he needs and he definitely isn’t going to be the one to crack 
so, if you want to push through your conversation with your friends and pretend he hasn’t been feeling you up this past hour, you go ahead. you’ll break eventually
v = volume [ how loud they are, what sound they make ]
no very loud would in comes to moans of pleasure, as they are usually quite muffled to some degree -- as he’s either muffling them into your skin as he presses kisses or is doing it more so under his breath
on the flip side, he isn’t quite when speaking to you. the amount of filth and sin that leaves his mouth as he slides into you over and over again is almost too much to handle. especially when it’s paired with his thick accent, that also, seemingly gets deeper the more settles into you
w = wild card [ get a random headcanon for the character of your choice ]
roleplay, specifically one where he can use the premise of him being a biker and you either taking on an authority figure or someone who’s seen in a more innocence light. bringing his kutte into the mix, or his bike is super appealing to him and anything the two of you can do with that is okay in his book
x = x-ray [ let’s see what’s going on in those pants, picture or words ]
six inches. thick and slightly veiny from bottom to tip. curves slightly when erect.
y = yearning [ how high is their sex drive? ]
despite his age, he has a medium to high sex drive. this all depends on what is currently going on and how he’s feeling. 
his sex drive is medium when he’s doing day to day things. being ready as almost a drop of a hat if you are wanting to initiate something with him during some down time or at a club party. it might take just a little convincing, however, you seem to have him wrapped around your finger and he has a hard time resisting you.
his sex drive is high when he’s very frustrated -- i.e. with happenings involving the club, or when he’s been while on a run for some time. however, he is a patient man and isn’t one to pull you away mid conversation with someone just to throw you into the bed and have his way with you. he will let you come to him and from there, will go as many rounds as the two of you will allow
z = zzz [ how quickly they fall asleep afterward ]
as his finishes off his cigarette, and the post-orgasm high has settled, he pulls you in close. letting you rest against his chest as finger tips run along your spine with practiced ease. it’s his way of showing you a small hint of affection without doing too much if that’s not what you are in the mood for
at this moment, he is fully relaxed and slowly starts to draft off. there is really no telling if he falls asleep first, or if you do, but he’ll fall asleep if he wants to. but not without making sure you are well taken care of before doing so
270 notes · View notes
Text
So the day after i was looking up The Witcher and Merlin crossovers (there was not many) i stumbled along a post on here that was asking if those two fandoms worked well enough together bc they were thinking of making their own. And since both my witcher posts are getting tons of notes and some of my older merlin posts are resurfacing, heres how i think theyd go together. I didnt see anyone go this route in any fanfic that i read
So a bit of a disclaimer. I know very little witcher lore/have only watched season 2 and i still dont fully comprehend the sphere things, and i havent seen a episode of merlin in about 7 years
So first off locations. Albion is the island of Britain. Camelot is a kingdom on a island that will become known as Albion "under Arthur's rule" (which was a lie because he DIED but whatever). The land the witcher takes place in is called The Continent, which conveniently has a lot of not solid canon maps so we can do almost whatever we want with locations. So... we make the island of Albion (and therefore Camelot) as a island off the coast of The Continent.
Camelot's magic policy = no magic users of any kind except druids (but that was temporary). So no sorceresses, mages, and probably no witchers. Camelot does tend to either go to war against kingdoms who allow (some) magic or enter tentative alliances with them. The Continent has magic users in some places/all over the Continent. So im thinking Uther never had significant contact with the mainland kingdoms/The Continent. We also only ever saw the sea in ONE episode of merlin so i think its safe to assume Camelot is also landlocked.
So that leaves the question of how do these two sets of characters get a chance to interact? Heres some various ideas:
Arthur travels to the mainland The Continent for political matters. He can be Prince or King at this point. Merlin (magic known or unknown) hasnt encountered many of these creatures and hasnt read much on any of them (since Camelot's books are on native creatures) so he's at a bit of a possibly major disadvantage
Morgana hears about how theres several powerful sorcerers/esses over on The Continent, that they even have schools. She goes over to The Continent in search of allies and soldiers for her army
If u want a slight AU same as above but its Morgana looking for schooling for herself. Either Morgause sent her there/died before she completed Morgana's High Priestess training. Or its when Morgana first discovers her powers and after the druid raid she or Merlin or someone else suggests she go to The Continent for training, because Uther has no control there
Because Camelot has no witchers and has banded sorcerers, they eventually have a monster terrorizing its citizens that they cant defeat. Uther can't trust any sorcerer, so he figures he can make a exception for temporary use of a witcher (kinda like how he was able to excuse using a dragonlord). Geralt is the unlucky witcher who got roped into going to Albion (and as per usual Merlin keeps trying to solve the situation himself...). Maybe Uther wants Geralt watched so Arthur (and therefore Merlin) takes that upon himself
This one is less likely considering how well known it is that Jaskier hangs out with magic people, but in the first episode of merlin Uther did invite and transport a singer to play for him in Camelot
Merlin (and friends?) accidentally transports himself to The Continent/Morgana transports him away and "away" turns out to be The Continent. He is now stranded
Yennefer/Geralt/whoever ends up going through a portal that drops them off in Camelot. They are now stranded
Do we know which kingdom Lettenhove is located? If not you can place Lettenhove in Albion/close to or in Camelot
Merlin goes to The Continent in search of [Magical Object] that Gaius or a Conveniently Placed Druid tells him he needs to save Arthur/stop the Big Bad Of Season __ (Nimue, Morgause, Morgana, etc)
33 notes · View notes
myundeadgayson · 3 years ago
Text
Mystic Messenger, but it’s actually C!Quackity on the DSMP
 …C!Quackity treating the DSMP like a dating sim joke, except I take it literally and tell you all the datable characters and Good, Bad, and Neutral Ends like this Mystic Messenger. (Disclaimer Note: This is all based on C!Quackity’s lore. This is also all based around their characters, NOT the CC’s. I am also NOT encouraging you to ship any of these characters -- especially bc some DO NOT feel comfortable with that. Also, no Minors are included because NO. This has just been a running Quackity joke for a while, and the concept of C!Quackity trying to flirt with all of these characters to speedrun the server like a legit dating sim sounds just so funny to me. Please do not attack me.)
Main Character Routes:
Sapnap (Good End: “Burning Love”, Neutral End: “I Love You, But Not Like That”, Bad End: “Twice Burned”) — can be connected to Karl’s Route
Karl Jacobs (Good End: ”Forever and Always”, Neutral End: “Friendzoned”, Bad End: “When Time Runs Out”) — can be connected to Sapnap’s Route 
Schlatt (Good End: “Alone, but Better”, Neutral End: “As the World Caves In”, Bad End: “Yes, Mr. President”)
Advanced Character Routes (only accessible after all Main Routes are completed):
Wilbur Soot (Good End: ”Ashes to Ashes, Dust to Dust”, Neutral End: “Two Sides of the Same Coin”, Bad End: “Enemies to Enemies”)
Technoblade (Good End: ”Tame the Blade”, Neutral End: “Enemies to... Allies?”, Bad End: “Dental Appointment”)
Karlnapity (Advanced Version): (Good End: “It’s About Time!”, Neutral End: “Only Time Will Tell”, Bad End: “...Who?”)
Secret Character Routes (only accessible after all routes above are completed):
Eret (Good End: “Flirt with the Traitor”, Neutral End: “You Need Friends, I Need Therapy”, Bad End: “Never Meant to Be”)
BadBoyHalo (Good End: “Dance with the Demon”, Neutral End: “...Sapnap’s Your What?”, Bad End: “An Eggsellent Ending, but a New Beginning”)
Bonus Route (only accessible when reaching halfway through Advanced Routes; technically a Bad End):
Philza Minecraft (??? End: Dilf Hunter Achievement: Become a Stepdad)
These are just the routes I’ve come up with for fun, and you can kind of see how a lot of them turn out by the names asjhdgksaj. (I don’t mind explaining what happens in any of them if you wanna know.) ** For anyone that doesn’t know Mystic Messenger by the way, there are 3 Main Endings (Good, Neutral, Bad) for Every Character, a True Neutral End, a True Bad End, and some other Bad Ends along the way if you start Good, then turn Bad towards a Character you’re pursuing.
But also, since this is Quackity… Him balancing out affection towards Karl and Sapnap, gets the Karlnapity Route, which is technically also a Main Route.
I will say though… Karl would probably have secret bonus options in the Advanced Routes that become available that involve Quackity finding out Karl’s a Time Traveler (something he discovers vaguely in Karl’s Main Route), but it leads to Quackity finding out more about Karl’s Time Travelling— the way Karl dies each time, the Dopplegangers, the Inbetween, etc.
Upon discovering all these things and finishing Karl’s Route in Advanced as a Good End, Secret Endings become Available to him. (This is where we’re gonna get SERIOUS, just so you know. We’re living like the Dream Daddy Simulator and there’s more lore than you realize.) More about the Secret Endings under the cut with the actual hidden lore because this post is about to be LONG.
These Secret Endings actually include Quackity witnessing Karl’s Time Traveling firsthand… Also, potentially Quackity traveling WITH Karl through time and into the Inbetween.
Upon him finishing this Secret Ending (which ends with him calming Karl through everything and a hopeful ending of him promising to help Karl to learn more about Karl’s abilities and save Karl’s memories), another route is open.
There’s Three Secret Endings that reveal themselves in total. That was only the first. The final two are connected, but the third being revealed depends on Quackity getting all the Main Bad Ends.
The Second Secret End is directly tied to Karl’s Bad End and the Fiancés’ Bad End in Advanced where in both, Karl forgets Quackity and Quackity lives alone in Las Nevadas.
In the OG Good Ending with Karl, they get married and stay El Rapids with Sapnap (romantic or platonically). In the Good Advanced with Karl, Quackity builds Las Nevadas and Karl almost forgets him, but Quackity comes home and finds out what happened.
The Second Secret Ending is what happens after Karl’s Advanced Bad Ending where he forgets Quackity. This Quackity, who’s chosen not to find out why he wasn’t invited to Kinoko, finds Sapnap struggling enough between helping Karl, managing Kinoko, and everything with Dream. Karl is gone again. Quackity, though still angry with the two, decides to help find Karl.
What ends up happening though is Quackity and Sapnap discover The Library (something Quackity discovers only in the Good Advanced End). They search around and find The Books. Obviously, the two start freaking out until Karl appears. This Karl isn’t their Karl. He looks the same, but there’s a noticeable white streak in his hair. Another thing is that he remembers Quackity.
It’s discovered in that moment that this “Dating Sim” situation with Quackity being able to restart through every path (though he fully never remembers any of them once the paths end) is the work of Time Travel. It’s Karl sending him back in time to make things right. The Karl in their timeline will only continue to get worse and lose all his memories. He NEEDS his memories, otherwise Karl can’t fix the timeline. There’s a huge threat that is going to be showing itself. Everyone WILL be doomed if Karl can’t repair the timeline, however, this Karl can’t fix it for him. Whatever threat that is going to come after them in the near future is following this Karl’s trail too closely. If this Karl tried to do it, he’d be leading the threat back in time with him and things would be doomed even sooner. He can only send back one, which is how Quackity gets chosen. Even though Quackity protests, Sapnap insists that it be Quackity to go. Sapnap can’t leave. If he did, he would be abandoning their timeline’s Karl, along with George and Kinoko. There’s a small argument between Quackity and Sapnap over this, but Sapnap admits he just Can’t. The timeline might change, but he couldn’t live with himself imagining Karl coming home without someone there to remind him that it is Home. Or George finally waking up and Sapnap not being able to be there. Quackity might have Las Nevadas to worry about, but Sapnap has the weight of two of the most important people in their lives on his shoulders. He can’t do it. Future Karl assures Quackity that he’d be good for this, too. That past Karl NEEDS him. His Fiancé NEEDS him. And this way, Quackity can help Sapnap! In the end, Quackity agrees. He reluctantly agrees to go. Future Karl just grins at him and hands him a pocket watch that in future runs, Quackity will be more aware of having because he’s actually had it in every route that wasn’t Karl’s Advanced Route. Right as Future Karl is teaching Quackity how to use it, the portal behind Karl turns a sickly neon green and yellow. Karl looks panicked at the sight. He quickly starts ushering Quackity to leave. NOW. Right as Quackity does, he just manages to see a glimpse of a hooded being stepping through the portal. He’s gone before he can see who it is. The Final Secret Ending becomes available.
The Final Secret Ending is ENTIRELY based on Quackity getting to all the Bad Endings for the Mains and all Karl’s Endings. That’s because the Final Secret Ending is, of course, about Dream. Up until this point, Dream has been doing his typical Dream things. In the Main Routes, he’s more of an idle character for Quackity because Quackity’s not directly involved with him yet. In the Advanced, Dream has reached the point of being imprisoned, thus Quackity is incredibly aware of everything Dream’s done. Somehow, this Dream eventually finds a way to escape the prison. He becomes more powerful upon getting released and somehow finds out about Karl’s powers, leading him down the road of wanting to understand him so that he himself can “fix the server”. Karl can’t allow Dream to tamper with the timeline because it’ll ruin everything. Dream, of course, finds a way into getting into Karl’s library and trying to find the necessary information to do it himself. Insert more plot leading to Dream eventually chasing Karl through the portals to stop Karl from reaching a timeline where they can change the story, and thus enters Quackity. In this Final Secret Ending, Quackity discovers everything that happening because Dream appears before Karl in The Library and reveals everything. Karl arrives late, just as this version of Dream is about to actually kill Quackity because, you know, personal reasons, but also Dream’s figured out Karl’s plan. Right as Dream’s about to kill Quackity though, Karl manages at the last second to shove Quackity the pocket watch, but Karl ends up getting killed in the process. Quackity has no time to mourn before he wakes back up in the past. And that’s all the Karl routes (which technically along with Sapnap) make for the True Endings! So there’s all of that story! ^u^ Definitely way more than I considered plotting out... But ya know,,, I fucking love Mystic Messenger and I love C!Quackity lore, along with C!Karl... So this started as a joke, but now you get lore to it! So please enjoy this brainrot! I put WAYYYY too much thought into it ajsgalkdjghlkd
75 notes · View notes
phoebehalliwell · 4 years ago
Note
if you could give 3 positive and 3 negative personality traits to each of the next gen, what would they be?
ooh love it. okay. we know i talk a lot. A Lot. i’m doing this in waves. first set of siblings under the cut (wcm). 2.9k. ily!
wyatt i think it’s say kind bc like. he genuinely tries really hard to be a nice person. considerate which is kind of the same as kind but again he like. he knows the elders almost killed him as a little kid he knows there’s a world where he does go dark side and that does weigh on him, so he tries to put other’s feelings first as much as possible. and then third positive trait ummmm generous which again is kinda all in the same category but it’s like. like wyatt is insanely talented not just like as a witch tho he’s that too he’s also like really smart but he’s not a dick about it he’s one of those kids who’s always like i’ll help u with your homework! what r u doing after school later! like. he has a wealth of knowledge and he doesn’t just sit on it he likes to share. this is one of the reasons henry jr is also so close with wyatt because like. they both share this genuine love and interest in the study of like old magicks so to speak like. histories of witches and demons etc most classes the rest of the next gen honestly find kinda boring. on the flipside his negative traits would be like um a tendency to play by the book he’s a little too strict not because he necessarily believes in it but more again he wants to stay in line so as not to get you know. murdered or w/e. another negative trait is a i would say wyatt gets like way too overattached, especially in relationships, but it’s not limited to that. yes he’s a jump then fall guy & i’ve written about this before (multiple times), but i also think it’s the same with like innocents. like the fact of the matter is is that you literally cannot save anyone but wyatt has never and will never learn to accept that and i think he gets. he takes it real hard whenever he loses somebody and gets really pissy and closed off in the aftermath. a third negative trait is like. overprotective. like. in my writings he’s not the twice blessed anymore but he’s still wicked powerful, and he’s also like. the eldest. so he kind of feels this burden to protect his family. it doesn’t help that throughout their youth like chris ever the demon hunter always sought out trouble and leo who Really Didn’t Want To Watch Chris Die Again kind of always passed on whatever the mission was to wyatt. which, yeah, gave chris issues, but it also gave wyatt issues! because in his head, it really is his responsibility to handle these things for his family. and, yes, sometimes he can relinquish this power a little bit like not actively hover over his family while they’re demon hunting, but if he’s not you know. actively there, he’s either scrying or he’s sensing (if he can do that idk) and just. he’s got this feeling that anything bad that happens to his family is his fault. like he has this great power, so if someone gets hurt, like, he should have been there because he definitely could have stopped it. however, this energy kinda harshes everyone else’s buzz, which is why the other tend not to involve wyatt in their plotlines too much.
moving on to chris who just for the record i already wrote for but thanks to the beauty of this site i accidentally clicked the wrong button & now it's gone. so. take two! i don't remember what i said. okay so first trait i'm giving him is. i honest to god cannot remember what i said previously no wait that's a lie because i remember now because it was interesting. because i think chris is interesting, and i think that's a good thing. because like. i wouldn't describe him as likeable i would not say he has the personality trait of Likable™ because like. he doesn't. but people still really like him. because he is interesting. like they see him and go huh wow i wanna know what's going on there all in all i think people kinda gravitate towards him. but of course flipside i think he doesn't necessarily choose to become friends with everyone who approaches him i think he tends to be a bit picky just because you know he's so guarded so i think he has friends but no like. really super close friends. so like first negative trait is he kinda appears aloof because i mean. he's kinda gotta lotta issues you know and it's not something you can really easily explain to someone non-magical because magic is so deeply ingrained into who he is (which also adds to the aloofness because there are just certain topics he'll drop certain things he just won't talk about and its not because he doesn't care or anything it's just like. that's a really big reveal and rather that spin some elaborate web of lies i think chris just like straight up does the i can't tell you that bit, which makes him seem you know well like aloof kinda a little bit dickish). and then of course there's also like. like a lot of vulnerability involved in understanding who chris is he really doesn't have any middle layers nothing that sits between the surface mortal chris and the charmed chris with an inferiority complex it's either you know it all or you know. he just seems aloof. but again like. i think he's interesting. so much so that a lot of people are just kinda willing to look past that. so like. a lot of just external relationships. surface level. & then another defining trait of his on the positive side is clever. because like. he's smart. like i think he's a really skilled witch i think he's an excellent spellcaster and then like. i also think he can do math and stuff (in my fic he is a coder so like. yeah.) but i think it's kind of beyond just like Oh He's Smart i think it's the way he applies his brains applies his knowledge that really kind of sets him apart from the rest i think he really is clever. and then third positive i think chris is resourceful. i think like. i think he likes to have a sense of indepence away from his family because like. i mean he is a halliwell and he doesn’t shy away from that but at the same time he doesn’t really want to like. lean on that rest on well the thing is it’s not even his laurels to rest on. he wants to have this sense of independence and he’s actually p good at getting it. like i having him living on his own (so 2 speak, he has like. 4 roommates? i’m p sure) and yeah he’s not super great at it from just like. a living perspective you know but he’s making it i think like paying his own rent all that and yeah like the food he eats isn’t great and his room is kind of always a disaster but like. he’s made it p far i think a lot farther than people thought he could no disrespect. so i think he's really able to take what lifes gives him and make the most out of it i don't think he likes to coast by on others' accomplishments. which kinda segues into the second negative trait which i think you probably could guess he's overly-independent like independent to a fault. because like. i think he really wants to define himself with kinda comes in a two-fold way because like. okay in-family he wants to. okay so like obvi, there's a major drop off in power between him and wyatt. and i think he's always kinda been insecure about it think what on earth caused such a cosmic fuck up that he's just a telekinetic and then his brother is like. a baby god. so i think chris really feels this need to prove himself worth of a place in the warren line like cement his skills as and really say you know i deserve this title. and then flipside!! he really doesn't want to rely on titles you know he doesn't want respect because he's a charmed one or because he's a halliwell he wants respect off his own merits he wants people to know him by his actions not the legacy he carries. (also maybe gives reason for chris to occasionally use the name chris perry in the altered timeline??) and then. kind of building off that negative trait for his third one i'm saying listless because like. i think the crucial difference between the chris from the dark timeline and chris from the light timeline is like. darktl!chris has always had purpose. like yes it's a shitty purpose it's a burden it's too much to place on one boy but he is the last halliwell you know it's like basically all on him to stop wyatt from you know annihilating the world. (someone should probably tell him the cupitches exist in the dark future lmao) you know from like very very early on in his life darktl!chris has known he's destined for something big and honestly he might fail but he's gotta give it the ole college try because this is the world on his shoulders he's gotta put up a good fight for it. lighttl!chris literally does not have that. he does not have some grand, epic purpose, some monumental destiny to fulfill and like. what is he supposed to do, you know? why is he here? and he feels like he should have some epic destiny hmm well no not exactly he wants some epic destiny but he feels like if there were some epic destiny to be had it'd probably pass over him in favor for something better just like everything else in his life does. like why is he here? literally why is he here i mean okay so like disclaimer is that chris in my story is like. 20/21 and um. also a college dropout lmao haha and like. call a spade a spade we're probz looking at some undiagnosed depression here like give him a zoloft he'll be fine but like. chris feels like he's kinda on a raft in the middle of open ocean in a sense like. the best option is to pick a direction and paddle and hope he reaches land but he's literally in open ocean there are no markers no indicators he doesn't know where to go and like. if he picks wrong he's just heading closer and closer to nothing at all emptiness death whatever And There's No Way To Know Which Way Is Towards Land. and if he fucks up, like, he's screwed. shout out to all my early twenty-somethings. woot woot. but yeah. i think chris really wants a sense of purpose that simply put he does not have and honestly? will not be getting. i am not giving him a prophecy. i am not giving him a destiny. he will have to live with that. and, at this point in his life, i think he's doing a p bad job at that. lmao.
melinda!! baby girl. angel. honestly? i'm going to give her kind too because i think a large part of her just really wants to help people. i've previously called her the most-whitelightery of the next gen, & then also she is currently going to school with designs to become a nurse because like. she's also an empath you know and i think she definitely has aspirations to kind of mix her magical and mortal sides find a balance of both worlds and use her magic powers to enhance how she can better care for people in a mortal way. i'd also say she's really understanding. like, she's the third sibling to the wyatt-chris duo And she's an empath like. even if she doesn't get it, she gets it. like. things are complicated relationships are complicated like she can literally feel all sides of the story whenever there's a wyatt-chris-leo argument and like. what? is only one of them right? is only one of them allowed to feel the way they feel? no. she gets it. she all kinda understands where they're coming from. she understands. and then third positive trait she's really loving. like she's not a person who's stingy with her love (in a platonic sense. i think it a romantic sense it gets a lot more complicated because like. as an empath on the first date well it's just too weird man and it's. it's not like she can't keep her feelings sorted it's just like knowing exactly how they feel about her….. like it's weird. pass.) but i think she really like. i think she loves her family i think she loves her friends like. ❤. wow. on the more negative side i think she kind of like. self sacrificial. like she'll goes to the ends of the earth for the people she loves before she ever stops to think about herself. she doesn't. like she won't self advocate she won't draw a line in the sand when it comes to the ones she loves she fails to um. to see how sometimes her needs might actually be more important that others like. like if she loves you she will walk until her feet bleed. like. you have to be real careful because like. if you ask her to do something like she'll do it you can tack on that "but it's fine if no you don't have to" because if she feels your need to have this task done she'll do it. it's for love. but it's not good. (she will also extend this to non-loved ones again if she feels their need their like desperate need because at the end of the day she's a giver. hey kinda like the giving tree. i think she loves that book.) i also think she's just a shade naive and i kind of hesitate to use that word because like. i feel like it implies kind of a lack of worldly experience and like. melinda has seen a lot. but i think she like really does kind of see the world through rose colored glass i think she believes that people are intrinsically good and want to help each other and um. this can kinda tee her up for a lot of heartbreak and/or disillusionment with the world when kinda the reality is placed there right before her and it just kind of blows. i think it kind of hurts fresh every time. and then a third and final negative trait i think she like takes on too much, from an emotional standpoint, and doesn't really give anything back. kinda the same as self-sacrificial, but like with a twist. like, yes, as established, she has a lot of love in her heart, and she will take on her friend's emotional burdens (as well as any other burdens they might have for her) but then kinda gives nothing in return. she's a bit guarded in a sense. because again. this all comes back to the empath thing. kind of build on the dating thing. you really get live feedback on what exactly they think about you when you unpack, and like. melinda can't take that. she's too in her head on how this directly impacts their view of her and then she's just reading them and not focusing on her own problems you know like. like ladies if you've ever hit like. 1:30 in the morning at a slumber party when shit starts going from hehehe chetoh doost lasdkajldf to like. i don't think i could ever reasonably get married because divorce has really been the only constant in my life and i genuinely don't think i could trust another person enough to tie myself to them legally.? that's melinda's mcfuckin time to shine i think she does play therapist/peacemaker like a lot she likes it because again. she likes helping people! especially the people she loves!! but um. she'll never partake the other direction she really doesn't like getting vulnerable herself because like. you know if your friends are lying to you like you say something really personal and then cap it off with a y'know? and they all go yeah totally but you can feel them going what,,, the fuck. no?? like. like melinda could not take that it has not happened to her yet (probably) but she's come up with the hypothetical and she could not take that. this doesn't really extend to family just because she knows them so long like oh what chris thinks she's lame? okay. wyatt thinks she's overreacting? yeah i know what i've seen buddyboy. & then. for the record. neither or her brothers would never think she is lame or overreacting even If melinda is being lame or overreacting because they just like wouldn't they know her too well. but melinda's def the person who comes up with worst case hypotheticals in regards to her relationship/empathy powers like. all the time.
24 notes · View notes
hermitcraftheadcanons · 4 years ago
Note
i feel like u mentioned having some kind of personal hc bout evil x at some point?? maybe it was another blog, just curious
Yeah, I do have one! It's a little bit hard to explain (and maybe a bit overboard with the lore), but I'll do my best:
TL;DR: Evil X is a past version of Xisuma who got consumed by the unlimited power of admin abilities. Due to timeline weirdness he developed differently than X did and never gained a moral compass.
Way, WAY too detailed analysis under the cut, if you're interested.
Disclaimer: I'm analyzing lore because I like to analyze lore, I am in no way trying to say anything about X as an actual person
So. The three main info sources we have on EX are his abilities, his characterization/personality, and the way X interacts with him. A lot of this stuff is pretty inconsistent in canon but if we're willing to overlook some bumpy patches we can get a few key points.
First of all, to me it seems like Evil X's power set is basically just admin abilities with a lack of moral limitations. He can summon other entities (minions, tnt, etc.), he can replace blocks with other blocks, he can summon lightening. These are all things you can do with commands: aka, things Xisuma himself could do but doesn’t (because self control and loving your friends and all that stuff)
Then, we have EX's characterization (which I'll be honest with you, isn't a lot). If we're going on purely canon information, he's usually portrayed as kind of immature. He does things seemingly on impulse with no backup for if plan A doesn't work, he tends to rely on brute force more so than strategy, and he doesn't really think ahead much. In my opinion, he's also portrayed as very lonely. On multiple occasions his plans relied on trusting an entity or entities (his minions, the voice in the Nether) that later betrayed him, and any time X has tried to be friendly to him he really seems to be in need of that connection and understanding. In general he just gives off the vibes of a lost and hurting younger person in need of some guidance and experience.
That brings us to how Xisuma interacts with him, which is very interesting. He's willing to do whatever it takes to stop EX if he's trying to destroy the server, but as soon as the immediate danger is no longer present, Xisuma shows kindness to EX startlingly easily. It's almost as if he knows somehow that the thing EX needs is just someone to understand him, to listen and help him see more constructive uses for the power he's found himself with. Or at least, he thinks he knows this. In the end X does seem to give up on that goal by banning him, but we'll get to that later.
Now, my own personal headcanon about admin powers is that they can be taught and learned, but some people are spawned in already having a natural affinity for them. I think that X was one of those people, and that Evil X is a version of him from way back when he was first exploring his abilities.
Imagine: having only just come into existence, and then having the power to create and destroy the very fundamentals of your world itself with a single typed command. In the beginning, the temptation to push that power more and more, to stretch it and see just how far you can go, just how effectively you can warp the universe to your will...it must have been overwhelming. (If you don't believe me, just look at the amount of tnt used by the average child in creative mode lol)
I think for the first few years of having his abilities Xisuma kind of let it go to his head. It's easy to distance yourself from every other living thing when you can destroy them so easily, easy to stop thinking of them as living.
Obviously in X's case he moved away from that stage. As much of a rush as this power was to use, he did not want a legacy of ashes. He eventually started learning new ways to use his power, ways that created instead of destroyed, and he found that he liked it much better. He started seeking out people he could connect with, trying to find his own humanity again. He built and protected and felt at home in the peace he'd made, for himself and the Hermits, his new found family. He swore he would never use his abilities like that again.
However at some point in the height of those early days of power madness, X did something that split the timeline. The universe fractured and created a parallel version of himself that never developed beyond that initial destructive stage. How and why Evil X crossed over to the main timeline is up to interpretation (I have a few ideas but this post is way too long already), but when he showed up X knew exactly who he was looking at.
Xisuma thought he knew how to save Evil X because he knew what he'd needed at that stage of his life: to find his humanity again. So, he tried to make a genuine human connection at every possible opportunity. He was always willing to fight if necessary to protect his friends, but whenever EX wasn’t posing an immediate physical threat, he would try his best to reach out, to give him a chance.
What he failed to realize, of course, was that by interacting with EX he'd just changed the timeline. Evil X is now not set on the same path as Xisuma: different events have happened to him, therefore he is turning into a different person. With that fatal flaw in mind, X realized it was not a guarantee that EX would ever move past the stage of power-drunk sabotage. I think Xisuma eventually decided that the risk to his friends and all they had built together wasn't worth the reward, and banned him. It wasn’t easy, but he finally had to accept that the person who’d been haunting him was no longer him.
Wow, that was a long post! I have to say I really do like the various brother or clone headcanons for EX, but I really like exploring the more original concept of an “evil self”.
Still, even my Evil Xisuma isn't necessarily "evil", or at least he doesn't have to be. He just spawned in with incredible power and no experience, and didn't really know what else to do with himself. It's awfully hard to know right from wrong when you have no moral frame of reference. However, if someone were to come along and offer him that frame of reference...say, a certain superhero... who's name starts with a W and ends with "ormman"...maybe he could still be redeemed :)
64 notes · View notes
qwerty-the-duck · 6 years ago
Photo
Tumblr media Tumblr media Tumblr media Tumblr media Tumblr media
‘Cuz this post bouta be hella long, Imma out the text under the cut ^U^
Also, here’s the link to some background info to the story for these characters
Welcome To LSS!
So, as you can see I separated these twenty OC’s into 5 groups. I will be going down the groups and from left to right through the characters. But, first a few disclaimers. 
A) I did not draw these in the order that I am introducing them, and my art is already pretty inconsistent so…sorry?
B) These are only the first 20 characters that directly interacted (or are) the main characters of the story. The reasoning was explained in an earlier post
C) All art was done digitally on Medibang, a free art program.
D) As we go down the list the explanations and descriptions of the characters will become vaguer, but I am always down to answer any questions.
E) Lastly, I am not planning on posting any of my writing soon after this post so I will be being less careful about spoilers in this post. I am still going to avoid major things though, so yeah.
At the top is the main four characters, which is why they have full bodies instead of just busts.
Alecs. She is eighteen years old, technically, and is just over five feet tall (153cm.) She has silver (not gray) hair that is lazily parted to one side. Due to a necessary “procedure,” she only has one purple/pink eye. The other is just a socket filled with a special worm, thus eyepatch. She is not a full human, and her body is sexless. She doesn’t really have a gender and doesn’t have sexuality either (as stated before she is not a sexual being) and other people use She/her pronouns but she doesn’t actually care herself. Her body is feminine shaped but a little extra chub on her.
She is quiet and observant. Her emotions are very compact and she really only gets angry when someone is talking sh*t about Bee. She is illiterate and not very knowledgable of the world, making her very dependent on Bee whenever they go on a mission or travel. She isn’t a mean or malicious person but she isn’t altruistic either, really only doing things when she is asked to. She also keeps Bee focused and tries to keep him from starting drama.
She used an old fashioned sword for fighting for a few reasons. One, she has never been practically trained so it’s easy to just swing around. Two, the sword is made of reinforced materials that balance out her overwhelming strength. Three, it was a gift from Bee (daw.)
Being as she is not a real human, her mutations are a little strange. Her offensive mutation is just raw power. She has overwhelming strength due to her body being made mostly of just straight hyper-radiation. Her defensive mutation is endless regeneration, that’s right, she literally cannot die. I want to point out that while she does sound OP, she doesn’t actually do a lot of fighting and can only act when Bee allows her to. 
Alecs gets assigned to the Black Department. She was originally assigned to red, but her lack of social skills and her apathetic attitude lead to concern and she was then moved to Black.
Bee (Benson) (My personal fav) - He is thirty-two years old, and is pretty tall, around six-six (201cm) He has white hair slicked back on top with it shaved on the sides and black (Yes it grows that way naturally, and it actually serves as vital tell of his character) and blue eyes. He often wears dopey and bright clothing with some utility, such as large pocketed pants and boots. Often on his wrist are his dog tags. He has a scar on his left eye that cuts through his black brow. His teeth are jagged and sharp. He is muscular and toned, having a bit of heft to his body. He is our gay son and I love him with my whole being. And he is cisgender male. 
He is the guy who is always smiling. His light humorous attitude comes through is any circumstance and sometimes leads to other people becoming irritated or offended. He is humble but cocky at the sometimes, only speaking the honest truth about situations. He is a bit of a loveable asshole, constantly taking the piss out of a person or situation. He’s a great teammate but performs better alone, often taking is out route in a plan without risking others. He pretty much takes care of Alecs as like an older brother but isn’t always great at it. 
Bee uses his bare fists to fight. He is part of the “military” - an elite selection of mutants who handle tasks deemed too difficult for other citizens to handle. He is well versed in several weapons and fighting styles but a more mixed style of hand-to-hand works best with his mutations and personality on the field. 
Bee is a Clan Breed mutant. His two powers stem from his one mutation. Due to his role in the military, his mutation has been named by his comrades and authorities. His mutation (named Beelzebub) allows him to convert multiple forms of energy into his own, most efficiently through ingestion. The offensive power from this is the ability to use this as his own strength, literally, like, he is strong boi. His defensive power is a little cheat. Not only can he absorb the energy from the attack, negating damage, but he can also use energy to heal injuries and combat fatigue. But with such a one-sided power there is always a catch. He does have to be careful since his power does originally come from hyper-radiation. While he can use other forms of energy, his body depends on HR, when he loses too much he falls into a primal type of state and just kinda tries to eat everything. This leads to Bee depending mostly on his military and physical training over the use of his powers.
Bee is in the Red department. His prowess for battle, as well as the versatility of his mutation, made him a great battle asset. (The the fact that he is Military would have told them that but whatever.)
Kat - Kat is an unknown age and is five-ten in height (177cm.) She has bright purple hair (yes, naturally) and medium brown eyes. She has a slimmer build but is toned. On her sides are zipper-like black shapes that run from her navel around her back to the other side.  When fighting, she often wears smaller articles of clothing, due to her defensive mutation, but otherwise, she wears casual, lounging clothes. Kat is pansexual and is in a relationship with Ric. She is cisgender female but can change to a male-sex body if need be.
Kat is a kind person if you are kind to her. She is a mutual respect kind of woman who is stern, cool and collected but has a big heart. She is like the vodka aunt but more responsible. She has an unexplained knowledge of the history of the world.
Kat has a combat knife but is able to manage with several types of weapons and uses her offensive mutation to turn whatever surrounding objects into a weapon. She joined the department a long time before the beginning of my story so she already has a lot of experience with how it works. 
Kats offensive mutation is the ability to change the shape of objects. She cannot change the mass of said material but can change its density, size, and shape to make weapons, tools, etc. She cannot change the basic compounds of things either. Iron cannot be changed to water etc. And also cannot change the state of matter of an object against its nature. She cannot make room temperature water into ice or solidify oxygen. Her defensive mutation is the ability to "shed her skin" With this she can heal simple injuries as well as change her appearance. She can change everything but her skin color and hair color. However, she can only shed once a day and will have to later revert back to her natural body. 
Kat was formerly a member of the white department, her transformation ability seen as a valuable resource for field support. But, since she has been a member of Central for so long she is qualified as a freelance member who can come and go as she pleases. 
Ric (the edge lord) - He is twenty-five years old and stands at five-seven (170 cm.) His hair is pitch-black. It is actually so dark that it seems to absorb the light from around him. He slicks his hair back to keep the dark shadows from covering his face. His eyes are a similar black darkening the whites of his eyes around his iris. Ric is lean, slightly lanky as isn’t as muscular as Kat or Bee. Due to his past and constantly being dirty and wearing hospital garbs, he is now slightly obsessed with wearing neater, collected clothing..thus suit. He also wears a brown leather gun harness around his chest when battling. Ric is a panromantic asexual. He is in a happy relationship with Kat and is a cisguy
Ric is a reserved, cynical person. His past lead him to miss proper people skills. Not to the extreme that he doesn’t know how to communicate or is clueless, he just very brash and direct. He would rather not talk to people if need be. He is nice though and does has a heroic part of his personality, finding himself helping strangers when he can. He is very calm and collected...on the outside. He is a very anxiety-filled guy who is constantly watching his surroundings. This causes him to overthink a lot and sometimes find himself overwhelmed. Both Kat and Ai help to keep him calm. Ai is an identity in Ric’s brain (no, this is not an attempt at DID or schizophrenia or anything and I try to make that clear is the story as well) who helps Ric process and organize his rampant thoughts. 
Ric battles using two specially made guns loaded with bullets that disrupt hyper-radiation. They were made by Kat and often have to be repaired due to Ric’s excessive use of the guns as blunt melee weaponry. Ric is also incredibly intelligent and can quickly make plans in his head with his observations and quick thinking.
Ric was originally born a nonmutant but his crazy-ass dad found a way to save him just before he turns into a “zombie” and this also resulted in very broken powers developing. His offensive mutation is the ability to turn of the subconscious hesitation in the human body that keeps him from using his full strength. In simple terms, he can push his body past the breaking point to use the high levels of strength that would normally be held back. This power does destroy his body when he uses it so he has to be careful when decided to use it. His defensive ability is a good combo with his offensive, however. He can heal any wound that he can reset or hold shut. So he can heal bones, semi-deep cuts and low-level amputations like fingers or a hand. He can’t heal damage to internal organs, his brain, or missing limbs like arms or legs. 
Ric is put in the Blue department. His exam was actually sabotaged, but his score on the writing part was high enough that his value was still seen for the field. He is a valuable recon asset to do his ability to quickly take in a communicate information to a team.
So from here on the explanations are going to be more limited to name, gender, sexuality (for whatever reason), mutations, and department. 
Lucy - Cishet guy. Clan Breed mutations. His offensive mutation is just having horns all over his head. They fall out and grow back all the time like shark teeth lel. Defensive is also having horns all over that grow back. He isn’t that great at fighting but is great as organizing his team and exploiting their abilities to make a great squad. His skills are so revered that he is Department Head of the blue department. 
Amanita - Cisgal bisexual. Her offensive mutation pores that she can expel from her palms and mouth that poison or weaken humans and kill nonmutant “zombies.” Her defensive is the blubs on her hair like tissue on her head. She can pull of these white and red-speckled balls and they can be ingested to heal and energize. Her powers sound similar and like they should be clan breed but they ain’t, I promise. Her ability to take down large amounts of foes from a distance makes her a strong fighter. Her stern attitude also makes her a level headed leader, helping her reach the position of Department Head for the red department. 
Erik - Cisguy aro-ace. So...prefacing by saying that Erik runs around in nothing but green painted handprints and bandages loosely covering his groin...yeah. His offensive power is the ability to change the density of objects. While the power can be used in multiple more ways that he uses it (sigh, phuck Erik) he tends to just make things heavier. The bandages are a convenient tool that he can use a weapon. He increases the density and can use them as restraints and traps. He can also make living things heavier. His defensive ability is able to make things fatigued. His voice is loud and tiring and commanding and his touch literally saps your energy away. His ability to catch and restrain unwanted individuals in Central along with his ability to motivate and organize his department is what let him become the Department Head of the green department, The Department of Central’s home security.
Alula - SPACE! Non-binary who uses she/her. She basically drips “space” designed black liquid everywhere and can control it as an extension of herself after that. She is a Clan breed so she also can heal wounds as long as it is covered in the black liquid. She is ruthless and quick to cut off those who don’t meet her standards. Her unruly behavior along with her overly powerful mutation gave her the spot of Department Head for the black department. 
Fifty-four  - Cishet guy. Named after his longest battle, lasting almost an hour, fifty-four sports the offensive mutation of weight distribution. His mutation can affect the way gravity and magnetism affects his body, moving his center of mass around in his body. His defensive mutation is a thick jelly-like coating that surrounds him. It’s invisible but is strong/thick enough to stop even a bullet from only a few feet away. Fifty-four is a member of the green department and is a proctor of the practical entrance exam due to his durability and stamina in battle. He is a member of the green department.
Belen - (the asshole egh) Cisguy gay. He has the ability to cause a hazing fog to appear. He can’t control what is shown, but often times is negative memories or hallucinations. He is a clan breed, his offensive and defensive stemming from one mutation.  His hazing fog can also have other psychosomatic effects on those who breathe it in. It can trick the body into thinking it’s lighter, heavier, frozen, injured, etc. Belen’s abilities, as well as his experience, make him a famous person amongst the Sanctum and Central. It also makes him a possible replacement as Head Chairperson for Sanctum, which is why he wears a golden pin. He is a member of the red department.
Sophia - Cishetwoman. The current Head Chairperson of Sanctum. Her offensive ability is the ability to force blood to flow out of the body and fester wounds. Any small cut from Sophia allows her to drain the entire body of blood or cripple the wound to a borderline amputation. This powerful offensive skill is countered by a weaker defensive ability. Her *literally* golden hair releases a cloud of dust that mesmerizes people forcing them to listen to her commands. It really only works on a human since “zombies” are mindless anyway. Sophia is technically a member of the red department but her position of Head Chairperson overrides that title.
Nadine - Cisgal lesbian. She has the offensive ability to be able to “disconnect” the brain from certain parts of the body. It can affect anywhere from just a finger to the whole body. This can be used to stop bleeding, paralyze a limb, stop motion, etc. This is a defensive and offensive ability, but Nadien is not a clan breed. Nadine also has the ability to read emotions, intentions, and feelings through touch. It’s not really a benefit in combat but helps when dealing with nonmutants in other sanctions and organizing squads in battle, setting her in the Blue department. Nadine is also a candidate for Head Chairperson but isn’t interested in the position, thus she doesn’t wear the golden pin.
Gideon (the grimy gross guy) - Cishet guy. His offensive ability is being able to directly influence the hyper-radiation in an object. While it is a very strong ability, he doesn’t like using it, since it also disturbs his own balance and makes him very sick. His defensive ability is being able to sterilize his surroundings. This sterilization goes beyond just germs and bacteria. Any single targeted compound can be immediately destroyed from a specific area. Gideon is a member of the yellow department, the research, and development department. He has been offered the DH position but declines every time in favor of his personal research and projects.
Frederick -  Cisguy pansexual. The youngest personal in Sanctum at the young age of fourteen. Federick has the offensive ability of super speed, pretty straight forward. The only problem with super speed is that the body is not build to handle that type of pressure change and inertia. Luckily, his defensive power is his ability to turn his bones and muscles to a rubber-like thing that bend to prevent damage from the speed of his movements. Sometimes he forgets though and hurts himself before activating his mutation. Frederick is a member of the blue team because his speed is good for recon and support.
Morgan - A selectively mute ace lesbian gal. She has “metal” sheets layered on her arms and legs that move and fold to cover her arms like claws and feet like talons. She also has the ability to communicate with animals with intent and body cues rather than spoken words as her defensive mutation. Morgan is a member of the red team do to the high defense and offense of her offensive mutation.
Idonea - (Got help from my friend @i-am-papercrane for this one) A young bisexual woman. She has the Clan Breed ability to control liquids. Thicker liquids are easier to manipulate for her. Her offensive ability is her control of blood, which she forms into weapons and tools. Her defensive ability is controlling moisture in the air to form quick, disposable shields, platforms, or other strategic things. She is in the Red department due to her working easily with others and her strong desire for battles. She also can (somewhat) tell how strong someone is by the quality of their blood.
This last section is mutant characters who did directly interact with the main characters, but I’m not sure if they will be coming back later in the story.
Keagan - A straight boy who lost one of his mutations due to losing his eye. His defensive mutation is the ability to condense and combine molecules in his surroundings. For example, he can combine hydrogen and oxygen to make water. He is not a member of Sanctum
Elliot - A genderfluid pansexual friend of Kat’s (pronouns change but I will be using she her cuz that’s what she uses during her scene in the story.) She is a clan breed. Her power to control threads that she produces acts as both defense and offense. She can quickly stitch together cloth and fabric to take the brunt of attacks and she can control puppets she made to attack for her. She owns a small clothing shop in the outskirts of East sanction so the puppets are just used as models and employes. Elliot is not a member of Sanctum
Roady  - An old cellmate of Ric’s. He has more likely hood of coming back in the story. His offensive mutation is the claws on his hands. His defensive mutation is acidic blood. He is a member of the green department due to his abrasive attitude and smug personality. His incompatibility in a team means he doesn’t fit in a field department but his fighting prowess is still valuable in the green department.
Arbor - A friendly neighborhood tree. Cishet guy. His brother shows up later, but for now, he doesn’t need to come back. Sorry, tree bud. Clan breed his offensive power is he’s a tree increased strength and his defensive power is he’s a tree having dense and tough skin
So that’s the notable characters that have been seen in name and face so far in LSS. Obviously, my concept art still isn’t exactly how I would like it, but it’s nice to see my guy, gals, and NB pals chillin’ in the real world. Depending on how I’m feeling I may do this for other stories (they won’t be nearly as long lel.) AS ALWAYS I am always down for answering any questions about the characters and/or story and I hope you the post is entertaining and interesting. Can you figure out who the antagonists are?
*Lastly, I’m sorry if this is a bit unorganized or confusing, this is my first time doing a) such a big post b) a post with multiple characters in it like this.*
**Also! I want to do some valentine’s day art with the main 4 so keep an eye out**
Have a good day everyone!
1 note · View note
melissenpai · 7 years ago
Text
the best character creator
do u want to make characters but cant draw for shit or ur hands are tired of holding a pen?? have you ever raged at character creators bc they only have 10 hairstyles and 5 outfits??? fear no more because here’s Kisekae!!!
Tumblr media
the models start like the default girl on the left, but w some effort you can make your husbando, cute gremlins, pokemon gijinka or whatever u want!!!
ok but, what is Kisekae?
Kisekae is a flash game/application that works mostly as a character creator, using a mix of interchangeable parts, bits you can move around freely, and lots of sliders to change sizes and positions. Think of it as the 2D version of the Sims/Spore creators.
ngl it started as a k-on hentai game back in like 2011?? there’s still k-on girls and lewd stuff around but the focus is far from it now.
Tumblr media
HERE is the sfw link and HERE is the nsfw one. careful w the hentai ads. You can also download an offline version from the creator’s Enty site
IF U WANNA TRY IT OUT CLICK THE READ MORE FOR A SMOL TUTORIAL
so u wanna learn about the suffering that is kisekae?? dont listen to people who say it’s the lazy tool for people too lazy to draw just like drawing, you can make a quick sketch in 10 mins or spend 6 hours adding detail and makin sure everything is PERFECT
so after this disclaimer lets bring it on!!!! click on a link and wait for the randomly generated k-on ocs to load
Tumblr media
maybe when you open it for the first time, the tabs look like this. THIS IS BAD it means it loaded on the easy mode.
Tumblr media
click here to unlock the Expert mode. it sounds scary, but it’s actually been the default mode for years. now you should see a lot of tabs.
LETS TALK ABOUT THE IMPORTANT STUFF FIRST
SAVING.
Tumblr media
This is the save tab. “SAVE” and “LOAD” save the entire scene in a .txt (all models, background, items etc). "Export” shows the codes of the selected models, so you can copy them and store them somewhere. You go to “Import” to paste codes and load characters. The small pencil button opens a window to save and load entire scenes in the app’s cookies. It’s very handy but you will lose everything if you clear your cookies. The last two buttons save or load ALL the data you have in the game, aka all the scenes you saved with the pencil button.
KISEKAE DOESNT HAVE AN UNDO BUTTON SO SAVE OFTEN IN CASE YOU MESS UP
TAKING PICTURES
Tumblr media
fOR THE LOVE OF GOD DO NOT DARE TAKE SCREENSHOTS there’s a handy way to save better quality pics. First slider is the zoom. It’ll be your best friend to get closer and edit faces and hairstyles and details and such. See that 05/05? That’s the PNG quality, so make sure it’s always at 5/5. The squares button next to the PNG one will make the background transparent when you snap a picture. Very cool, bc kisekae backgrounds are kinda ugly. The icon on the far right lets you select a region of the screen that’s great too
STOP THE AHEGAO
Next. If you click on the model’s clothes you’ll notice they disappear and they get surprised. The automatic emotions were good when it was a porn game but to actually create content it’s just annoying idk why it still automatically loads like that tbh.
Tumblr media
Anyway, go here to set the facial expressions to manual mode. The “Select/All” switch makes you edit all the models at the same time or just one.  (Note: as pochi adds more tabs, they can get moved around and be put in a different group. just keep looking thru the pages until you find the icon you want)
HAVE ONLY ONE MODEL
Tumblr media
You’ll most likely don’t need all 9 models at the same time, so you can go here to deactivate them. tbh it’s placed in a really weird place... a year ago it wasnt as confusing idk why Pochi added this update :/
TIME TO HAVE FUN
My recommendation is clicking on everything to see what happens. That’s honestly the best way to learn how to use it. Instead of explaining how to make good looking stuff (i cant do that bc. there’s not a single way of “doing things right” this is artistic expression u do what u do) i’ll jsut give some tips and tricks
1. HOLD SPACE TO GO OVER THE LIMITS OF MOST SLIDERS. It works wonders. Make heads smaller, shoulders broader, eyes thinner, hair pieces larger, bend time and space with the unlimited power of space key.
2. HAIR PIECES ARE NOT HAIR PIECES. BELTS ARE NOT BELTS. RIBBONS ARE NOT RIBBONS. Think of them as shapes to make stuff. Use hair pieces to make capes. Use the lines in the facemark section to draw a new nose. Make entire pieces of clothing out of belts and ribbons. The only downside is that if you move the head, hair pieces and ribbons move with them so making clothes out of ribbons turns your characters into statues
3. CLICK ON CLOTHES TO CHANGE STUFF. If you click on some clothing pieces you can change some things like unbuttoning shirt buttons, opening sweaters, putting sunglasses on their head and removing parts of scarves.
4. THE DEFAULT PALETTE IS UGLY. please do use a custom one
5. YOU RAN OUT OF SLOTS? Use the free floating items on the 3rd set of tabs. You can have extra belts, ribbons, arms, furniture and speech bubbles. Even load external images. But keep in mind extra stuff is not attached to characters, so it won’t move around with them or save in their individual codes.
6. USE OTHER PEOPLE’S EXPORTS RESPONSIBLY. There are lots of people on deviantArt and the Pochi forums (official Kisekae forums) that make character, clothing or hairstyle exports for other people to load and use on their creations (like Sims mods!). However, most dA people have rules if you want to use them on something you upload, so make sure to read each user’s rules!
7. TECHNICALLY THERE ARE NO MALE, MUSCULAR OR BIG BODY TYPES. You can force it out, but we’ve been forever cursed with the hip size being linked to the leg size. So your guys will either have feminine hips or scrawny ass legs. There aren’t any muscle options apart from abs, and the most similar thing we have for chub is a pregnant looking belly. You can always edit it with photoshop later or suffer and make muscles and fat with belts and hairs.
Have fun suffering with Kisekae!!! Feel free to ask me questions on how to do X or Y, or request me to expand more information about stuff like what each tab does.
CLICK HERE FOR THE OFFICIAL GUIDE!! It does explain a bit what each tab does, and also explains the keyboard shortcuts. It’s in japanese, but nothing google translate can’t fix if you need it.
78 notes · View notes
uniformbravo · 7 years ago
Text
so this post got me thinking about reigen & his attitude towards mob before and during the separation arc, so i thought i’d just. share my thoughts
(definitely read that post first, this is like partially based on it)
ok disclaimer before i start: im not saying anything im about to say is like. “”The Correct Interpretation”” or whatever, this is just. how i see things. feel free to disagree ok
now can i be real for a sec. like maybe a little Too Real: i really don’t like how the anime handled reigen. u can tell they pushed really hard to make him more likable, like they really really want you to like him so they intentionally framed him in a way that convinces you to admire him; the “conman with a heart of gold” who’s essentially adopted mob and acts as a role model for him, right
and it’s so easy to see him that way if your introductory (or sole) point of reference is the anime (especially with the way they inserted and altered that scene showing how mob & reigen met in ep 11). but in the manga, at least the way i see it, he is just Pure Sleaze through and through, doing anything and everything to keep manipulating mob into staying with him- tells him joining a club to make friends is a waste of time, tries to convince him that no one at school wants to spend time with him anyway, that they all just make fun of him behind his back. he doesn’t respect him, he makes him do things he is very obviously uncomfortable with, he constantly calls him out of the blue expecting him to drop everything (though “it’s not like you had anything going on anyway”) for random jobs despite having been asked several times before not to do that, etc etc
i honestly feel like any time it looks like reigen is being a Good Person and helping mob out it’s at least partially the result of selfish motives; he needs to keep mob happy on the job or else he won’t want to come back anymore (i wonder if that’s part of the reason reigen started taking him out for food). literally the main reason he even shows up for the first claw arc is because mob didn’t show up for work and he needs to drag him back to reprimand him (tho i could see there being an underlying concern for him there as well)*
i mean, just look at their entire situation objectively: a man in his mid-twenties takes advantage of a literal child for his own monetary gain like??? god
anyway the reason i love the separation arc so damn much is because reigen finally fucking realizes what a grade A piece of shit he’s being, and he feels guilty as hell about it and it’s so fucking satisfying like holy shit literally bye reigen
he realizes that mob is worth so much more than the shit he’s been putting him through (what a concept!) and, even further, he realizes that mob is an extremely important (even integral) part of his life and he’s been taking him for granted (an understatement) this entire time. he realizes that he looks up to mob, actually admires him, and that sets everything in perspective for him- the realization that this kid half his age is progressing more than he himself ever has, is a bigger person than he’ll ever be if he continues down the path he’s on now, and that the only thing reigen had ever done for him up until he finally left was hold him back in every way possible
most importantly though, to me at least, is the immediate change he goes through upon having these realizations: he admits that he was wrong and rectifies his last statement to him, publicly, in the hope that it’ll somehow reach mob wherever he is (because he isn’t planning to see or bother him any more in person after this), and he expects nothing in return (kind of amazing for a guy who thus far has done nothing but strive to squeeze every ounce of attention and respect out of every breathing human he comes into contact with)
and when mob shows up at the end, he isn’t received with the gloating “ha, i knew you’d come to your senses eventually” that reigen was very obviously prepared to give before, but instead with a simple, “why did you come?”
because he knows now, he knows he fucked up and that mob has absolutely no reason to forgive him or even speak to him ever again (”i said a terrible thing to him”) ((you said many terrible things to him)), so to see him then and there, after all that, his reaction becomes “what are you doing here, why are you even giving me the time of day, you were right to leave” and that alone already shows so much growth
(and mob, of course, forgives him, because he can see that reigen has learned his fuckin lesson now- honestly in the beginning of the arc reigen was waiting for mob to come to his senses so he could gloat but what really happened was reigen coming to his damn senses and mob going “i knew u had it in you :)” and i think that’s beautiful)
what i love about that analysis / modified translation is that it does a much better job getting across what a condescending piece of shit reigen was being before, and hammers home the weight of what this realization means to him, the full depth of it in context, the subtle nuances, just. everything. it’s so good. it’s so fucking good im #Blessed im living this is such incredibly valuable information @ op thank u???
In Conclusion reigen arataka invented character development, the separation arc saved my life, and that analysis made me immortal
-
*second disclaimer: when i say reigen only cares about keeping mob to work for him, im just talking about like. his base motivation. if he really was a heartless asshole who didn’t care about mob at all, the events of the separation arc wouldn’t have had any effect on him- he would’ve just gone on being bitter about his most valuable asset ditching him over what he saw as a small argument
i think that initially, back when they first met, reigen was only concerned with the thought of “oh shit i could make a fortune off this kid” (because before he found out about his powers he was annoyed & trying to get rid of him lol) but as time went on he grew a soft spot for him that eventually turned into actually caring about him, but it’s more of a subconscious thing; he doesn’t actually realize how much he cares about mob until he leaves, which is why it hits him so hard when he finally does realize
it’s not a random epiphany, either; it builds over the course of the entire arc, starting when mob stops showing up for work. reigen isn’t prepared to suddenly have that absence in his life, and he’s definitely not ready to confront the possibility (read: fact) that he’s in the wrong. so he pushes all the blame onto mob, convinces himself that he’s just overreacting and that he’ll come crawling back in no time, because mob needs him, he needs him. as far as reigen is convinced, mob doesn’t have anyone else to go to besides him, his sole mentor in life, so in the end it doesn’t even matter if reigen was shitty to him (which, of course, he definitely wasn’t) because mob has no other choice but to return in the end
then of course that all flies out the window when reigen sees mob with his friends in public and it blows his entire goddamn mind and he’s forced to acknowledge the fact that okay, so maybe mob does have friends, and even more, he’s having a good time with them?? he’s not completely floundering without reigen or obsessively thinking about him 24/7 consumed with the question of when things will go back to normal????
and reigen just cannot face that reality, that he’s not the hot shit he thought he was to mob, that his absence has literally zero effect on him, that he’s the only one falling apart over this, so he shoves it all aside and distracts himself with work. throws himself into his work, fuels himself with burning spite and dedicates every waking hour to proving that no, i don’t need him either, if he can get along fine without me then i can do a thousand times better without him holding me back. that’s what he tells himself, and that’s what he believes, but the whole thing is nothing more than one huge distraction, big enough to cover the giant absence suddenly gaping within him like a tarp thrown over so he doesn’t have to look at it, because he doesn’t want to look at it, he wants nothing to do with it
and that works, for a while. he gets wrapped up in success and fame and probably even manages to forget about mob for a little while- until everything comes crashing down and he hits the lowest point in his career, maybe even his life (definitely, from a writing standpoint, his story arc). only then do his thoughts return to mob, and only then does everything hit him in full force. everything he’s been holding back, everything he’s refused to admit, and then some- feelings he never even knew about in the first place but that he realizes were there all along
most importantly, he finally accepts that he was in the wrong and that he has no one to blame for this entire disaster but himself
and that’s where the change begins
(basically, reigen has cared about mob the whole time but he’s a dumbass and didn’t realize it so he just kept treating him the way he always has until mob got himself tf out of there and gave him the biggest wake up call of his life #goodnight arataka)
14 notes · View notes
techscopic · 7 years ago
Text
How to Build a Kubernetes Cluster with ARM Raspberry Pi then run .NET Core on OpenFaas
First, why would you do this? Why not. It’s awesome. It’s a learning experience. It’s cheaper to get 6 pis than six “real computers.” It’s somewhat portable. While you can certainly quickly and easily build a Kubernetes Cluster in the cloud within your browser using a Cloud Shell, there’s something more visceral about learning it this way, IMHO. Additionally, it’s a non-trivial little bit of power you’ve got here. This is also a great little development cluster for experimenting. I’m very happy with the result.
By the end of this blog post you’ll have not just Hello World but you’ll have Cloud Native Distributed Containerized RESTful microservice based on ARMv7 w/ k8s Hello World! as a service. (original Tweet).
Not familiar with why Kubernetes is cool? Check out Julia Evans’ blog and read her K8s posts and you’ll be convinced!
Hardware List (scroll down for Software)
Here’s your shopping list. You may have a bunch of this stuff already. I had the Raspberry Pis and SD Cards already.
6 – Raspberry Pi 3 – I picked 6, but you should have at least 3 or 4.
One Boss/Master and n workers. I did 6 because it’s perfect for the power supply, perfect for the 8-port hub, AND it’s a big but not unruly number.
6 – Samsung 32Gb Micro SDHC cards – Don’t be too cheap.
Faster SD cards are better.
2×6 – 1ft flat Ethernet cables – Flat is the key here.
They are WAY more flexible. If you try to do this with regular 1ft cables you’ll find them inflexible and frustrating. Get extras.
1 – Anker PowerPort 6 Port USB Charging Hub – Regardless of this entire blog post, this product is amazing.
It’s almost the same physical size as a Raspberry Pi, so it fits perfect at the bottom of your stack. It puts out 2.4a per port AND (wait for it) it includes SIX 1ft Micro USB cables…perfect for running 6 Raspberry Pis with a single power adapter.
1 – 7 layer Raspberry Pi Clear Case Enclosure – I only used 6 of these, which is cool.
I love this case, and it looks fantastic.
1 – Black Box USB-Powered 8-Port Switch – This is another amazing and AFAIK unique product.
An overarching goal for this little stack is that it be easy to move around and set up but also to power. We have power to spare, so I’d like to avoid a bunch of “wall warts” or power adapters. This is an 8 port switch that can be powered over a Raspberry Pi’s USB. Because I’m given up to 2.4A to each micro USB, I just plugged this hub into one of the Pis and it worked no problem. It’s also…wait for it…the size of a Pi. It also include magnets for mounting.
1 – Some Small Router – This one is a little tricky and somewhat optional.
You can just put these Pis on your own Wifi and access them that way, but you need to think about how they get their IP address. Who doles out IPs via DHCP? Static Leases? Static IPs completely?
The root question is – How portable do you want this stack to be? I propose you give them their own address space and their own router that you then use to bridge to other places. Easiest way is with another router (you likely have one lying around, as I did. Could be any router…and remember hub/switch != router.
Here is a bad network diagram that makes the point, I think. The idea is that I should be able to go to a hotel or another place and just plug the little router into whatever external internet is available and the cluster will just work. Again, not needed unless portability matters to you as it does to me.
You could ALSO possibly get this to work with a Travel Router but then the external internet it consumed would be just Wifi and your other clients would get on your network subnet via Wifi as well. I wanted the relative predictability of wired.
What I WISH existed was a small router – similar to that little 8 port hub – that was powered off USB and had an internal and external Ethernet port. This ZyXEL Travel Router is very close…hm…
Optional – Pelican Case if you want portability. I’ll see what airport security thinks. O_O
Optional – Tiny Keyboard and Mouse – Raspberry Pis can put out about 500mA per port for mice and keyboards. The number one problem I see with Pis is not giving them enough power and/or then having an external device take too much and then destabilize the system. This little keyboard is also a touchpad mouse and can be used to debug your Pi when you can’t get remote access to it. You’ll also want an HMDI cable occasionally.
You’re Rich – If you have money to burn, get the 7″ Touchscreen Display and a Case for it, just to show off htop in color on one of the Pis.
Dodgey Network Diagram
Disclaimer
OK, first things first, a few disclaimers.
The software in this space is moving fast. There’s a non-zero chance that some of this software will have a new version out before I finish this blog post. In fact, when I was setting up Kubernetes, I created a few nodes, went to bed for 6 hours, came back and made a few more nodes and a new version had come out. Try to keep track, keep notes, and be aware of what works with what.
Next, I’m just learning this stuff. I may get some of this wrong. While I’ve built (very) large distributed systems before, my experience with large orchestrators (primarily in banks) was with large proprietary ones in Java, C++, COM, and later in C#, .NET 1.x,2.0, and WCF. It’s been really fascinating to see how Kubernetes thinks about these things and comparing it to how we thought about these things in the 90s and very early 2000s. A lot of best practices that were HUGE challenges many years ago are now being codified and soon, I hope, will “just work” for a new generation of developer. At least another full page of my resume is being marked [Obsolete] and I’m here for it. Things change and they are getting better.
Software
Get your Raspberry PIs and SD cards together. Also bookmark and subscribe to Alex Ellis’ blog as you’re going to find yourself there a lot. He’s the author of OpenFaas, which I’ll be using today and he’s done a LOT of work making this experiment possible. So thank you Alex for being awesome! He has a great post on how Multi-stage Docker files make it possible to effectively use .NET Core on a Raspberry Pi while still building on your main machine. He and I spent a few late nights going around and around to make this easy.
Alex has put together a Gist we iterated on and I’ll summarize here. You’ll do these instructions n times for all machines.
You’ll do special stuff for the ONE master/boss node and different stuff for the some number of worker nodes.
ADVANCED TIP! If you know what you’re doing Linux-wise, you should save this excellent prep.sh shell script that Alex made, then SKIP to the node-specific instructions below. If you want to learn more, do it step by step.
ALL NODES
Burn Jessie to a SD Card
You’re going to want to get a copy of Raspbian Jesse Lite and burn it to your SD Cards with Etcher, which is the only SD Card Burner you need. It’s WAY better than the competition and it’s open source.
You can also try out Hypriot and their “optimized docker image for Raspberry Pi” but I personally tried to get it working reliably for a two days and went back to Jesse. No disrespect.
Creating an empty file called “ssh” before you put the card in the Raspberry Pi
SSH into the new Pi
I’m on Windows so I used WSL (Ubuntu) for Windows that lets me SSH and do run Linux natively.
ssh pi@raspberrypi
Login pi, password raspberry.
Change the Hostname
I ran
rasbpi-config
then immediately reboot with “sudo reboot”
Install Docker
curl -sSL get.docker.com | sh && \ sudo usermod pi -aG docker
Disable Swap. Important, you’ll get errors in Kuberenetes otherwise
sudo dphys-swapfile swapoff && \ sudo dphys-swapfile uninstall && \ sudo update-rc.d dphys-swapfile remove
Go edit /boot/cmdline.txt with your favorite editor, or use
sudo nano /boot/cmdline
and add this at the very end. Don’t press enter.
cgroup_enable=cpuset cgroup_enable=memory
Install Kubernetes
curl -s http://ift.tt/22fimui | sudo apt-key add - && \ echo "deb http://ift.tt/2f7PUy5 kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \ sudo apt-get update -q && \ sudo apt-get install -qy kubeadm
MASTER/BOSS NODE
After ssh’ing into my main node, I used /ifconfig eth0 to figure out what the IP adresss was. Ideally you want this to be static (not changing) or at least a static lease. I logged into my router and set it as a static lease, so my main node ended up being 192.168.170.2, and .1 is the router itself.
Then I initialized this main node
sudo kubeadm init --apiserver-advertise-address=192.168.170.2
This took a WHILE. Like 10-15 min, so be patient.
Kubernetes uses this admin.conf for a ton of stuff, so you’re going to want a copy in your $HOME folder so you can call “kubectl” easily later, copy it and take ownership.
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
When this is done, you’ll get a nice print out with a ton of info and a token you have to save. Save it all. I took a screenshot.
WORKER NODES
Ssh into your worker nodes and join them each to the main node. This line is the line you needed to have saved above when you did a kubectl init.
kubeadm join --token d758dc.059e9693bfa5 192.168.170.2:6443 --discovery-token-ca-cert-hash sha256:c66cb9deebfc58800a4afbedf0e70b93c086d02426f6175a716ee2f4d
Did it work?
While ssh’ed into the main node – or from any networked machine that has the admin.conf on it – try a few commands.
Here I’m trying “kubectl get nodes” and “kubectl get pods.”
Note that I already have some stuff installed, so you’ll want try “kubectl get pods –namespace kube-system” to see stuff running. If everything is “Running” then you can finish setting up networking. Kubernetes has fifty-eleven choices for networking and I’m not qualified to pick one. I tried Flannel and gave up and then tried Weave and it just worked. YMMV. Again, double check Alex’s Gist if this changes.
kubectl apply -f http://ift.tt/2qJxB6N
At this point you should be ready to run some code!
Hello World…with Markdown
Back to Alex’s gist, I’ll try this “markdownrender” app. It will take some Markdown and return HTML.
Go get the function.yml from here and create the new app on your new cluster.
$ kubectl create -f function.yml $ curl -4 http://localhost:31118 -d "# test" <p><h1>test</h1></p>
This part can be tricky – it was for me. You need to understand what you’re doing here. How do we know the ports? A few ways. First, it’s listed as nodePort in the function.yml that represents the desired state of the application.
We can also run “kubectl get svc” and see the ports for various services.
pi@hanselboss1:~ $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager NodePort 10.103.43.130 <none> 9093:31113/TCP 1d dotnet-ping ClusterIP 10.100.153.185 <none> 8080/TCP 1d faas-netesd NodePort 10.103.9.25 <none> 8080:31111/TCP 2d gateway NodePort 10.111.130.61 <none> 8080:31112/TCP 2d http-ping ClusterIP 10.102.150.8 <none> 8080/TCP 1d kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d markdownrender NodePort 10.104.121.82 <none> 8080:31118/TCP 1d nodeinfo ClusterIP 10.106.2.233 <none> 8080/TCP 1d prometheus NodePort 10.98.110.232 <none> 9090:31119/TCP 2d
See those ports that are outside:insider? You can get to markdownrender directly from 31118 on an internal IP like localhost, or the main/master IP. Those 10.x.x.x are all software networking, you can not worry about them. See?
pi@hanselboss1:~ $ curl -4 http://ift.tt/2zWjCfR -d "# test" <h1>test</h1> pi@hanselboss1:~ $ curl -4 http://ift.tt/2xuMdHf -d "# test" curl: (7) Failed to connect to 10.104.121.82 port 31118: Network is unreachable
Can we access this cluster from another machine? My Windows laptop, perhaps?
Access your Raspberry Pi Kubernetes Cluster from your Windows Machine (or elsewhere)
I put KubeCtl on my local Windows machine put it in the PATH.
I copied the admin.conf over from my Raspberry Pi. You will likely use scp or WinSCP.
I made a little local batch file like this. I may end up with multiple clusters and I want it easy to switch between them.
SET KUBECONFIG=”C:\users\scott\desktop\k8s for pi\admin.conf
Once you have Kubectl on another machine that isn’t your Pi, try running “kubectl proxy” and see if you can hit your cluster like this. Remember you’ll get weird “Connection refused” if kubectl thinks you’re talking to a local cluster.
Here you can get to localhost:8001/api and move around, then you’ve successfully punched a hole over to your cluster (proxied) and you can treat localhost:8001 as your cluster. So “kubectl proxy” made that possible.
If you have WSL (Windows Subsystem for Linux) – and you should – then you could also do this and TUNNEL to the API. But I’m going to get cert errors and generally get frustrated. However, tunneling like this to other apps from Windows or elsewhere IS super useful. What about the Kubernetes Dashboard?
~ $ sudo ssh -L 8001:10.96.0.1:443 [email protected]
I’m going to install the Kubernetes Dashboard like this:
kubectl apply -f http://ift.tt/2xudwS6
Pay close attention to that URL! There are several sites out there that may point to older URLs, non ARM dashboard, or use shortened URLs. Make sure you’re applying the ARM dashboard. I looked here http://ift.tt/2zWjCMT.
Notice I’m using the “alternative” dashboard. That’s for development and I’m saying I don’t care at all about security when accessing it. Be aware.
I can see where my Dashboard is running, the port and the IP address.
pi@hanselboss1:~ $ kubectl get svc --namespace kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 2d kubernetes-dashboard ClusterIP 10.98.2.15 <none> 80/TCP 2d
NOW I can punch a hole with that nice ssh tunnel…
~ $ sudo ssh -L 8080:10.98.2.15:80 [email protected]
I can access the Kubernetes Dashboard now from my Windows machine at http://localhost:8080 and hit Skip to login.
Do note the Namespace dropdown and think about what you’re viewing. There’s the kube-system stuff that manages the cluster
Adding OpenFaas and calling a serverless function
Let’s go to the next level. We’ll install OpenFaas – think Azure Functions or Amazon Lambda, except for your own Docker and Kubernetes cluster. To be clear, OpenFaas is an Application that we will run on Kubernetes, and it will make it easier to run other apps. Then we’ll run other stuff on it…just some simple apps like Hello World in Python and .NET Core. OpenFaas is one of several open source “Serverless” solutions.
Do you need to use OpenFaas? No. But if your goal is to write a DoIt() function and put it on your little cluster easily and scale it out, it’s pretty fabulous.
Remember my definition of Serverless…there ARE servers, you just don’t think about them.
Serverless Computing is like this – Your code, a slider bar, and your credit card.
Let’s go.
.NET Core on OpenFaas on Kubernetes on Raspberry Pi
I ssh’ed into my main/master cluster Pi and set up OpenFaas:
git clone http://ift.tt/2eHgAFS && cd faas-netes kubectl apply -f faas.armhf.yml,rbac.yml,monitoring.armhf.yml
Once OpenFaas is installed on your cluster, here’s Alex’s great instructions on how to setup your first OpenFaas Python function, so give that a try first and test it. Once we’ve installed that Python function, we can also hit http://ift.tt/2zWjFIz (where that’s your main Boss/Master’s IP) and see it the OpenFaas UI.
OpenFaas and the “faas-netes” we setup above automates the build and deployment of our apps as Docker Images to Kuberetes. It makes the “Developer’s Inner Loop” simpler. I’m going to make my .NET app, build, deploy, then change, build, deploy and I want it to “just work” on my cluster. And later, and I want it to scale.
I’m doing .NET Core, and since there is a runtime for .NET Core for Raspberry Pi (and ARM system) but no SDK, I need to do the build on my Windows machine and deploy from there.
Quick Aside: There are docker images for ARM/Raspberry PI for running .NET Core. However, you can’t build .NET Core apps (yet?) directly ON the ARM machine. You have to build them on an x86/x64 machine and then get them over to the ARM machine. That can be SCP/FTPing them, or it can be making a docker container and then pushing that new docker image up to a container registry, then telling Kubernetes about that image. K8s (cool abbv) will then bring that ARM image down and run it. The technical trick that Alex and I noticed was of course that since you’re building the Docker image on your x86/x64 machine, you can’t RUN any stuff on it. You can build the image but you can’t run stuff within it. It’s an unfortunate limitation for now until there’s a .NET Core SDK on ARM.
What’s required on my development machine (not my Raspberry Pis?
I installed KubeCtl (see above) in the PATH
I installed OpenFaas’s  Faas-CLI command line and put it in the PATH
I installed Docker for Windows. You’ll want to make sure your machine has some flavor of Docker if you have a Mac or Linux machine.
I ran docker login at least once.
I installed .NET Core from http://dot.net/core
Here’s the gist we came up with, again thanks Alex! I’m going to do it from Windows.
I’ll use the faas-cli to make a new function with charp. I’m calling mine dotnet-ping.
faas-cli new --lang csharp dotnet-ping
I’ll edit the FunctionHandler.cs to add a little more. I’d like to know the machine name so I can see the scaling happen when it does.
using System; using System.Text; namespace Function { public class FunctionHandler { public void Handle(string input) { Console.WriteLine("Hi your input was: "+ input + " on " + System.Environment.MachineName); } } }
Check out the .yml file for your new OpenFaas function. Note the gateway IP should be your main Pi, and the port is 31112 which is OpenFaas.
I also changed the image to include “shanselman/” which is my Docker Hub. You could also use a local Container Registry if you like.
provider: name: faas gateway: http://ift.tt/2xtjend functions: dotnet-ping: lang: csharp handler: ./dotnet-ping image: shanselman/dotnet-ping
Head over to the ./template/csharp/Dockerfile and we’re going to change it. Ordinarily it’s fine if you are publishing from x64 to x64 but since we are doing a little dance, we are going to build and publish the .NET apps as linux-arm from our x64 machine, THEN push it, we’ll use a multi stage docker file. Change the default Docker file to this:
FROM microsoft/dotnet:2.0-sdk as builder ENV DOTNET_CLI_TELEMETRY_OPTOUT 1 # Optimize for Docker builder caching by adding projects first. RUN mkdir -p /root/src/function WORKDIR /root/src/function COPY ./function/Function.csproj . WORKDIR /root/src/ COPY ./root.csproj . RUN dotnet restore ./root.csproj COPY . . RUN dotnet publish -c release -o published -r linux-arm ADD http://ift.tt/2zVAP98 /usr/bin/fwatchdog RUN chmod +x /usr/bin/fwatchdog FROM microsoft/dotnet:2.0.0-runtime-stretch-arm32v7 WORKDIR /root/ COPY --from=builder /root/src/published . COPY --from=builder /usr/bin/fwatchdog / ENV fprocess="dotnet ./root.dll" EXPOSE 8080 CMD ["/fwatchdog"]
Notice a few things. All the RUN commands are above the second FROM where we take the results of the first container and use its output to build the second ARM-based one. We can’t RUN stuff because we aren’t on ARM, right?
We use the Faas-Cli to build the app, build the docker container, AND publish the result to Kubernetes.
faas-cli build -f dotnet-ping.yml --parallel=1 faas-cli push -f dotnet-ping.yml faas-cli deploy -f dotnet-ping.yml --gateway http://ift.tt/2xtjend
And here is the dotnet-ping command running on the pi, as seen within the Kubernetes Dashboard.
I can then scale them out like this:
kubectl scale deploy/dotnet-ping --replicas=6
And if I hit it multiple times – either via curl or via the dashboard, I see it’s hitting different pods:
If I want to get super fancy, I can install Grafana – a dashboard manager by running locally in my machine on port 3000
docker run -p 3000:3000 -d grafana/grafana
Then I can add OpenFaas a datasource by pointing Grafana to http://ift.tt/2zVaKqu which is where the Prometheus metrics app is already running, then import the OpenFaas dashboard from the grafana.json file that is in the I cloned it from.
Super cool. I’m going to keep using this little Raspberry Pi Kubernetes Cluster to learn as I get ready to do real K8s in Azure! Thanks to Alex Ellis for his kindness and patience and to Jessie Frazelle for making me love both Windows AND Linux!
* If you like this blog, please do use my Amazon links as they help pay for projects like this! They don’t make me rich, but a few dollars here and there can pay for Raspberry Pis!
Sponsor: Check out JetBrains Rider: a new cross-platform .NET IDE. Edit, refactor, test and debug ASP.NET, .NET Framework, .NET Core, Xamarin or Unity applications. Learn more and download a 30-day trial!
© 2017 Scott Hanselman. All rights reserved.
      How to Build a Kubernetes Cluster with ARM Raspberry Pi then run .NET Core on OpenFaas syndicated from http://ift.tt/2wBRU5Z
0 notes
just4programmers · 7 years ago
Text
How to Build a Kubernetes Cluster with ARM Raspberry Pi then run .NET Core on OpenFaas
First, why would you do this? Why not. It's awesome. It's a learning experience. It's cheaper to get 6 pis than six "real computers." It's somewhat portable. While you can certainly quickly and easily build a Kubernetes Cluster in the cloud within your browser using a Cloud Shell, there's something more visceral about learning it this way, IMHO. Additionally, it's a non-trivial little bit of power you've got here. This is also a great little development cluster for experimenting. I'm very happy with the result.
By the end of this blog post you'll have not just Hello World but you'll have Cloud Native Distributed Containerized RESTful microservice based on ARMv7 w/ k8s Hello World! as a service. (original Tweet). ;)
Not familiar with why Kubernetes is cool? Check out Julia Evans' blog and read her K8s posts and you'll be convinced!
Hardware List (scroll down for Software)
Here's your shopping list. You may have a bunch of this stuff already. I had the Raspberry Pis and SD Cards already.
6 - Raspberry Pi 3 - I picked 6, but you should have at least 3 or 4.
One Boss/Master and n workers. I did 6 because it's perfect for the power supply, perfect for the 8-port hub, AND it's a big but not unruly number.
6 - Samsung 32Gb Micro SDHC cards - Don't be too cheap.
Faster SD cards are better.
2x6 - 1ft flat Ethernet cables - Flat is the key here.
They are WAY more flexible. If you try to do this with regular 1ft cables you'll find them inflexible and frustrating. Get extras.
1 - Anker PowerPort 6 Port USB Charging Hub - Regardless of this entire blog post, this product is amazing.
It's almost the same physical size as a Raspberry Pi, so it fits perfect at the bottom of your stack. It puts out 2.4a per port AND (wait for it) it includes SIX 1ft Micro USB cables...perfect for running 6 Raspberry Pis with a single power adapter.
1 - 7 layer Raspberry Pi Clear Case Enclosure - I only used 6 of these, which is cool.
I love this case, and it looks fantastic.
1 - Black Box USB-Powered 8-Port Switch - This is another amazing and AFAIK unique product.
An overarching goal for this little stack is that it be easy to move around and set up but also to power. We have power to spare, so I'd like to avoid a bunch of "wall warts" or power adapters. This is an 8 port switch that can be powered over a Raspberry Pi's USB. Because I'm given up to 2.4A to each micro USB, I just plugged this hub into one of the Pis and it worked no problem. It's also...wait for it...the size of a Pi. It also include magnets for mounting.
1 - Some Small Router - This one is a little tricky and somewhat optional.
You can just put these Pis on your own Wifi and access them that way, but you need to think about how they get their IP address. Who doles out IPs via DHCP? Static Leases? Static IPs completely?
The root question is - How portable do you want this stack to be? I propose you give them their own address space and their own router that you then use to bridge to other places. Easiest way is with another router (you likely have one lying around, as I did. Could be any router...and remember hub/switch != router.
Here is a bad network diagram that makes the point, I think. The idea is that I should be able to go to a hotel or another place and just plug the little router into whatever external internet is available and the cluster will just work. Again, not needed unless portability matters to you as it does to me.
You could ALSO possibly get this to work with a Travel Router but then the external internet it consumed would be just Wifi and your other clients would get on your network subnet via Wifi as well. I wanted the relative predictability of wired.
What I WISH existed was a small router - similar to that little 8 port hub - that was powered off USB and had an internal and external Ethernet port. This ZyXEL Travel Router is very close...hm...
Optional - Pelican Case if you want portability. I'll see what airport security thinks. O_O
Optional - Tiny Keyboard and Mouse - Raspberry Pis can put out about 500mA per port for mice and keyboards. The number one problem I see with Pis is not giving them enough power and/or then having an external device take too much and then destabilize the system. This little keyboard is also a touchpad mouse and can be used to debug your Pi when you can't get remote access to it. You'll also want an HMDI cable occasionally.
You're Rich - If you have money to burn, get the 7" Touchscreen Display and a Case for it, just to show off htop in color on one of the Pis.
Dodgey Network Diagram
Disclaimer
OK, first things first, a few disclaimers.
The software in this space is moving fast. There's a non-zero chance that some of this software will have a new version out before I finish this blog post. In fact, when I was setting up Kubernetes, I created a few nodes, went to bed for 6 hours, came back and made a few more nodes and a new version had come out. Try to keep track, keep notes, and be aware of what works with what.
Next, I'm just learning this stuff. I may get some of this wrong. While I've built (very) large distributed systems before, my experience with large orchestrators (primarily in banks) was with large proprietary ones in Java, C++, COM, and later in C#, .NET 1.x,2.0, and WCF. It's been really fascinating to see how Kubernetes thinks about these things and comparing it to how we thought about these things in the 90s and very early 2000s. A lot of best practices that were HUGE challenges many years ago are now being codified and soon, I hope, will "just work" for a new generation of developer. At least another full page of my resume is being marked [Obsolete] and I'm here for it. Things change and they are getting better.
Software
Get your Raspberry PIs and SD cards together. Also bookmark and subscribe to Alex Ellis' blog as you're going to find yourself there a lot. He's the author of OpenFaas, which I'll be using today and he's done a LOT of work making this experiment possible. So thank you Alex for being awesome! He has a great post on how Multi-stage Docker files make it possible to effectively use .NET Core on a Raspberry Pi while still building on your main machine. He and I spent a few late nights going around and around to make this easy.
Alex has put together a Gist we iterated on and I'll summarize here. You'll do these instructions n times for all machines.
You'll do special stuff for the ONE master/boss node and different stuff for the some number of worker nodes.
ADVANCED TIP! If you know what you're doing Linux-wise, you should save this excellent prep.sh shell script that Alex made, then SKIP to the node-specific instructions below. If you want to learn more, do it step by step.
ALL NODES
Burn Jessie to a SD Card
You're going to want to get a copy of Raspbian Jesse Lite and burn it to your SD Cards with Etcher, which is the only SD Card Burner you need. It's WAY better than the competition and it's open source.
You can also try out Hypriot and their "optimized docker image for Raspberry Pi" but I personally tried to get it working reliably for a two days and went back to Jesse. No disrespect.
Creating an empty file called "ssh" before you put the card in the Raspberry Pi
SSH into the new Pi
I'm on Windows so I used WSL (Ubuntu) for Windows that lets me SSH and do run Linux natively.
ssh pi@raspberrypi
Login pi, password raspberry.
Change the Hostname
I ran
rasbpi-config
then immediately reboot with "sudo reboot"
Install Docker
curl -sSL get.docker.com | sh && \ sudo usermod pi -aG docker
Disable Swap. Important, you'll get errors in Kuberenetes otherwise
sudo dphys-swapfile swapoff && \ sudo dphys-swapfile uninstall && \ sudo update-rc.d dphys-swapfile remove
Go edit /boot/cmdline.txt with your favorite editor, or use
sudo nano /boot/cmdline
and add this at the very end. Don't press enter.
cgroup_enable=cpuset cgroup_enable=memory
Install Kubernetes
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && \ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \ sudo apt-get update -q && \ sudo apt-get install -qy kubeadm
MASTER/BOSS NODE
After ssh'ing into my main node, I used /ifconfig eth0 to figure out what the IP adresss was. Ideally you want this to be static (not changing) or at least a static lease. I logged into my router and set it as a static lease, so my main node ended up being 192.168.170.2, and .1 is the router itself.
Then I initialized this main node
sudo kubeadm init --apiserver-advertise-address=192.168.170.2
This took a WHILE. Like 10-15 min, so be patient.
Kubernetes uses this admin.conf for a ton of stuff, so you're going to want a copy in your $HOME folder so you can call "kubectl" easily later, copy it and take ownership.
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
When this is done, you'll get a nice print out with a ton of info and a token you have to save. Save it all. I took a screenshot.
WORKER NODES
Ssh into your worker nodes and join them each to the main node. This line is the line you needed to have saved above when you did a kubectl init.
kubeadm join --token d758dc.059e9693bfa5 192.168.170.2:6443 --discovery-token-ca-cert-hash sha256:c66cb9deebfc58800a4afbedf0e70b93c086d02426f6175a716ee2f4d
Did it work?
While ssh'ed into the main node - or from any networked machine that has the admin.conf on it - try a few commands.
Here I'm trying "kubectl get nodes" and "kubectl get pods."
Note that I already have some stuff installed, so you'll want try "kubectl get pods --namespace kube-system" to see stuff running. If everything is "Running" then you can finish setting up networking. Kubernetes has fifty-eleven choices for networking and I'm not qualified to pick one. I tried Flannel and gave up and then tried Weave and it just worked. YMMV. Again, double check Alex's Gist if this changes.
kubectl apply -f https://git.io/weave-kube-1.6
At this point you should be ready to run some code!
Hello World...with Markdown
Back to Alex's gist, I'll try this "markdownrender" app. It will take some Markdown and return HTML.
Go get the function.yml from here and create the new app on your new cluster.
$ kubectl create -f function.yml $ curl -4 http://localhost:31118 -d "# test" <p><h1>test</h1></p>
This part can be tricky - it was for me. You need to understand what you're doing here. How do we know the ports? A few ways. First, it's listed as nodePort in the function.yml that represents the desired state of the application.
We can also run "kubectl get svc" and see the ports for various services.
pi@hanselboss1:~ $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager NodePort 10.103.43.130 <none> 9093:31113/TCP 1d dotnet-ping ClusterIP 10.100.153.185 <none> 8080/TCP 1d faas-netesd NodePort 10.103.9.25 <none> 8080:31111/TCP 2d gateway NodePort 10.111.130.61 <none> 8080:31112/TCP 2d http-ping ClusterIP 10.102.150.8 <none> 8080/TCP 1d kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d markdownrender NodePort 10.104.121.82 <none> 8080:31118/TCP 1d nodeinfo ClusterIP 10.106.2.233 <none> 8080/TCP 1d prometheus NodePort 10.98.110.232 <none> 9090:31119/TCP 2d
See those ports that are outside:insider? You can get to markdownrender directly from 31118 on an internal IP like localhost, or the main/master IP. Those 10.x.x.x are all software networking, you can not worry about them. See?
pi@hanselboss1:~ $ curl -4 http://192.168.170.2:31118 -d "# test" <h1>test</h1> pi@hanselboss1:~ $ curl -4 http://10.104.121.82:31118 -d "# test" curl: (7) Failed to connect to 10.104.121.82 port 31118: Network is unreachable
Can we access this cluster from another machine? My Windows laptop, perhaps?
Access your Raspberry Pi Kubernetes Cluster from your Windows Machine (or elsewhere)
I put KubeCtl on my local Windows machine put it in the PATH.
I copied the admin.conf over from my Raspberry Pi. You will likely use scp or WinSCP.
I made a little local batch file like this. I may end up with multiple clusters and I want it easy to switch between them.
SET KUBECONFIG="C:\users\scott\desktop\k8s for pi\admin.conf
Once you have Kubectl on another machine that isn't your Pi, try running "kubectl proxy" and see if you can hit your cluster like this. Remember you'll get weird "Connection refused" if kubectl thinks you're talking to a local cluster.
Here you can get to localhost:8001/api and move around, then you've successfully punched a hole over to your cluster (proxied) and you can treat localhost:8001 as your cluster. So "kubectl proxy" made that possible.
If you have WSL (Windows Subsystem for Linux) - and you should - then you could also do this and TUNNEL to the API. But I'm going to get cert errors and generally get frustrated. However, tunneling like this to other apps from Windows or elsewhere IS super useful. What about the Kubernetes Dashboard?
~ $ sudo ssh -L 8001:10.96.0.1:443 [email protected]
I'm going to install the Kubernetes Dashboard like this:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard-arm.yaml
Pay close attention to that URL! There are several sites out there that may point to older URLs, non ARM dashboard, or use shortened URLs. Make sure you're applying the ARM dashboard. I looked here https://github.com/kubernetes/dashboard/tree/master/src/deploy.
Notice I'm using the "alternative" dashboard. That's for development and I'm saying I don't care at all about security when accessing it. Be aware.
I can see where my Dashboard is running, the port and the IP address.
pi@hanselboss1:~ $ kubectl get svc --namespace kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 2d kubernetes-dashboard ClusterIP 10.98.2.15 <none> 80/TCP 2d
NOW I can punch a hole with that nice ssh tunnel...
~ $ sudo ssh -L 8080:10.98.2.15:80 [email protected]
I can access the Kubernetes Dashboard now from my Windows machine at http://localhost:8080 and hit Skip to login.
Do note the Namespace dropdown and think about what you're viewing. There's the kube-system stuff that manages the cluster
Adding OpenFaas and calling a serverless function
Let's go to the next level. We'll install OpenFaas - think Azure Functions or Amazon Lambda, except for your own Docker and Kubernetes cluster. To be clear, OpenFaas is an Application that we will run on Kubernetes, and it will make it easier to run other apps. Then we'll run other stuff on it...just some simple apps like Hello World in Python and .NET Core. OpenFaas is one of several open source "Serverless" solutions.
Do you need to use OpenFaas? No. But if your goal is to write a DoIt() function and put it on your little cluster easily and scale it out, it's pretty fabulous.
Remember my definition of Serverless...there ARE servers, you just don't think about them.
Serverless Computing is like this - Your code, a slider bar, and your credit card.
Let's go.
.NET Core on OpenFaas on Kubernetes on Raspberry Pi
I ssh'ed into my main/master cluster Pi and set up OpenFaas:
git clone https://github.com/alexellis/faas-netes && cd faas-netes kubectl apply -f faas.armhf.yml,rbac.yml,monitoring.armhf.yml
Once OpenFaas is installed on your cluster, here's Alex's great instructions on how to setup your first OpenFaas Python function, so give that a try first and test it. Once we've installed that Python function, we can also hit http://192.168.170.2:31112/ui/ (where that's your main Boss/Master's IP) and see it the OpenFaas UI.
OpenFaas and the "faas-netes" we setup above automates the build and deployment of our apps as Docker Images to Kuberetes. It makes the "Developer's Inner Loop" simpler. I'm going to make my .NET app, build, deploy, then change, build, deploy and I want it to "just work" on my cluster. And later, and I want it to scale.
I'm doing .NET Core, and since there is a runtime for .NET Core for Raspberry Pi (and ARM system) but no SDK, I need to do the build on my Windows machine and deploy from there.
Quick Aside: There are docker images for ARM/Raspberry PI for running .NET Core. However, you can't build .NET Core apps (yet?) directly ON the ARM machine. You have to build them on an x86/x64 machine and then get them over to the ARM machine. That can be SCP/FTPing them, or it can be making a docker container and then pushing that new docker image up to a container registry, then telling Kubernetes about that image. K8s (cool abbv) will then bring that ARM image down and run it. The technical trick that Alex and I noticed was of course that since you're building the Docker image on your x86/x64 machine, you can't RUN any stuff on it. You can build the image but you can't run stuff within it. It's an unfortunate limitation for now until there's a .NET Core SDK on ARM.
What's required on my development machine (not my Raspberry Pis?
I installed KubeCtl (see above) in the PATH
I installed OpenFaas's  Faas-CLI command line and put it in the PATH
I installed Docker for Windows. You'll want to make sure your machine has some flavor of Docker if you have a Mac or Linux machine.
I ran docker login at least once.
I installed .NET Core from http://dot.net/core
Here's the gist we came up with, again thanks Alex! I'm going to do it from Windows.
I'll use the faas-cli to make a new function with charp. I'm calling mine dotnet-ping.
faas-cli new --lang csharp dotnet-ping
I'll edit the FunctionHandler.cs to add a little more. I'd like to know the machine name so I can see the scaling happen when it does.
using System; using System.Text; namespace Function { public class FunctionHandler { public void Handle(string input) { Console.WriteLine("Hi your input was: "+ input + " on " + System.Environment.MachineName); } } }
Check out the .yml file for your new OpenFaas function. Note the gateway IP should be your main Pi, and the port is 31112 which is OpenFaas.
I also changed the image to include "shanselman/" which is my Docker Hub. You could also use a local Container Registry if you like.
provider: name: faas gateway: http://192.168.170.2:31112 functions: dotnet-ping: lang: csharp handler: ./dotnet-ping image: shanselman/dotnet-ping
Head over to the ./template/csharp/Dockerfile and we're going to change it. Ordinarily it's fine if you are publishing from x64 to x64 but since we are doing a little dance, we are going to build and publish the .NET apps as linux-arm from our x64 machine, THEN push it, we'll use a multi stage docker file. Change the default Docker file to this:
FROM microsoft/dotnet:2.0-sdk as builder ENV DOTNET_CLI_TELEMETRY_OPTOUT 1 # Optimize for Docker builder caching by adding projects first. RUN mkdir -p /root/src/function WORKDIR /root/src/function COPY ./function/Function.csproj . WORKDIR /root/src/ COPY ./root.csproj . RUN dotnet restore ./root.csproj COPY . . RUN dotnet publish -c release -o published -r linux-arm ADD https://github.com/openfaas/faas/releases/download/0.6.1/fwatchdog-armhf /usr/bin/fwatchdog RUN chmod +x /usr/bin/fwatchdog FROM microsoft/dotnet:2.0.0-runtime-stretch-arm32v7 WORKDIR /root/ COPY --from=builder /root/src/published . COPY --from=builder /usr/bin/fwatchdog / ENV fprocess="dotnet ./root.dll" EXPOSE 8080 CMD ["/fwatchdog"]
Notice a few things. All the RUN commands are above the second FROM where we take the results of the first container and use its output to build the second ARM-based one. We can't RUN stuff because we aren't on ARM, right?
We use the Faas-Cli to build the app, build the docker container, AND publish the result to Kubernetes.
faas-cli build -f dotnet-ping.yml --parallel=1 faas-cli push -f dotnet-ping.yml faas-cli deploy -f dotnet-ping.yml --gateway http://192.168.170.2:31112
And here is the dotnet-ping command running on the pi, as seen within the Kubernetes Dashboard.
I can then scale them out like this:
kubectl scale deploy/dotnet-ping --replicas=6
And if I hit it multiple times - either via curl or via the dashboard, I see it's hitting different pods:
If I want to get super fancy, I can install Grafana - a dashboard manager by running locally in my machine on port 3000
docker run -p 3000:3000 -d grafana/grafana
Then I can add OpenFaas a datasource by pointing Grafana to http://192.168.170.2/31119 which is where the Prometheus metrics app is already running, then import the OpenFaas dashboard from the grafana.json file that is in the I cloned it from.
Super cool. I'm going to keep using this little Raspberry Pi Kubernetes Cluster to learn as I get ready to do real K8s in Azure! Thanks to Alex Ellis for his kindness and patience and to Jessie Frazelle for making me love both Windows AND Linux!
* If you like this blog, please do use my Amazon links as they help pay for projects like this! They don't make me rich, but a few dollars here and there can pay for Raspberry Pis!
Sponsor: Check out JetBrains Rider: a new cross-platform .NET IDE. Edit, refactor, test and debug ASP.NET, .NET Framework, .NET Core, Xamarin or Unity applications. Learn more and download a 30-day trial!
© 2017 Scott Hanselman. All rights reserved.
Tumblr media Tumblr media Tumblr media Tumblr media Tumblr media
0 notes
techscopic · 7 years ago
Text
How to Build a Kubernetes Cluster with ARM Raspberry Pi then run .NET Core on OpenFaas
First, why would you do this? Why not. It’s awesome. It’s a learning experience. It’s cheaper to get 6 pis than six “real computers.” It’s somewhat portable. While you can certainly quickly and easily build a Kubernetes Cluster in the cloud within your browser using a Cloud Shell, there’s something more visceral about learning it this way, IMHO. Additionally, it’s a non-trivial little bit of power you’ve got here. This is also a great little development cluster for experimenting. I’m very happy with the result.
By the end of this blog post you’ll have not just Hello World but you’ll have Cloud Native Distributed Containerized RESTful microservice based on ARMv7 w/ k8s Hello World! as a service. (original Tweet).
Not familiar with why Kubernetes is cool? Check out Julia Evans’ blog and read her K8s posts and you’ll be convinced!
Hardware List (scroll down for Software)
Here’s your shopping list. You may have a bunch of this stuff already. I had the Raspberry Pis and SD Cards already.
6 – Raspberry Pi 3 – I picked 6, but you should have at least 3 or 4.
One Boss/Master and n workers. I did 6 because it’s perfect for the power supply, perfect for the 8-port hub, AND it’s a big but not unruly number.
6 – Samsung 32Gb Micro SDHC cards – Don’t be too cheap.
Faster SD cards are better.
2×6 – 1ft flat Ethernet cables – Flat is the key here.
They are WAY more flexible. If you try to do this with regular 1ft cables you’ll find them inflexible and frustrating. Get extras.
1 – Anker PowerPort 6 Port USB Charging Hub – Regardless of this entire blog post, this product is amazing.
It’s almost the same physical size as a Raspberry Pi, so it fits perfect at the bottom of your stack. It puts out 2.4a per port AND (wait for it) it includes SIX 1ft Micro USB cables…perfect for running 6 Raspberry Pis with a single power adapter.
1 – 7 layer Raspberry Pi Clear Case Enclosure – I only used 6 of these, which is cool.
I love this case, and it looks fantastic.
1 – Black Box USB-Powered 8-Port Switch – This is another amazing and AFAIK unique product.
An overarching goal for this little stack is that it be easy to move around and set up but also to power. We have power to spare, so I’d like to avoid a bunch of “wall warts” or power adapters. This is an 8 port switch that can be powered over a Raspberry Pi’s USB. Because I’m given up to 2.4A to each micro USB, I just plugged this hub into one of the Pis and it worked no problem. It’s also…wait for it…the size of a Pi. It also include magnets for mounting.
1 – Some Small Router – This one is a little tricky and somewhat optional.
You can just put these Pis on your own Wifi and access them that way, but you need to think about how they get their IP address. Who doles out IPs via DHCP? Static Leases? Static IPs completely?
The root question is – How portable do you want this stack to be? I propose you give them their own address space and their own router that you then use to bridge to other places. Easiest way is with another router (you likely have one lying around, as I did. Could be any router…and remember hub/switch != router.
Here is a bad network diagram that makes the point, I think. The idea is that I should be able to go to a hotel or another place and just plug the little router into whatever external internet is available and the cluster will just work. Again, not needed unless portability matters to you as it does to me.
You could ALSO possibly get this to work with a Travel Router but then the external internet it consumed would be just Wifi and your other clients would get on your network subnet via Wifi as well. I wanted the relative predictability of wired.
What I WISH existed was a small router – similar to that little 8 port hub – that was powered off USB and had an internal and external Ethernet port. This ZyXEL Travel Router is very close…hm…
Optional – Pelican Case if you want portability. I’ll see what airport security thinks. O_O
Optional – Tiny Keyboard and Mouse – Raspberry Pis can put out about 500mA per port for mice and keyboards. The number one problem I see with Pis is not giving them enough power and/or then having an external device take too much and then destabilize the system. This little keyboard is also a touchpad mouse and can be used to debug your Pi when you can’t get remote access to it. You’ll also want an HMDI cable occasionally.
You’re Rich – If you have money to burn, get the 7″ Touchscreen Display and a Case for it, just to show off htop in color on one of the Pis.
Dodgey Network Diagram
Disclaimer
OK, first things first, a few disclaimers.
The software in this space is moving fast. There’s a non-zero chance that some of this software will have a new version out before I finish this blog post. In fact, when I was setting up Kubernetes, I created a few nodes, went to bed for 6 hours, came back and made a few more nodes and a new version had come out. Try to keep track, keep notes, and be aware of what works with what.
Next, I’m just learning this stuff. I may get some of this wrong. While I’ve built (very) large distributed systems before, my experience with large orchestrators (primarily in banks) was with large proprietary ones in Java, C++, COM, and later in C#, .NET 1.x,2.0, and WCF. It’s been really fascinating to see how Kubernetes thinks about these things and comparing it to how we thought about these things in the 90s and very early 2000s. A lot of best practices that were HUGE challenges many years ago are now being codified and soon, I hope, will “just work” for a new generation of developer. At least another full page of my resume is being marked [Obsolete] and I’m here for it. Things change and they are getting better.
Software
Get your Raspberry PIs and SD cards together. Also bookmark and subscribe to Alex Ellis’ blog as you’re going to find yourself there a lot. He’s the author of OpenFaas, which I’ll be using today and he’s done a LOT of work making this experiment possible. So thank you Alex for being awesome! He has a great post on how Multi-stage Docker files make it possible to effectively use .NET Core on a Raspberry Pi while still building on your main machine. He and I spent a few late nights going around and around to make this easy.
Alex has put together a Gist we iterated on and I’ll summarize here. You’ll do these instructions n times for all machines.
You’ll do special stuff for the ONE master/boss node and different stuff for the some number of worker nodes.
ADVANCED TIP! If you know what you’re doing Linux-wise, you should save this excellent prep.sh shell script that Alex made, then SKIP to the node-specific instructions below. If you want to learn more, do it step by step.
ALL NODES
Burn Jessie to a SD Card
You’re going to want to get a copy of Raspbian Jesse Lite and burn it to your SD Cards with Etcher, which is the only SD Card Burner you need. It’s WAY better than the competition and it’s open source.
You can also try out Hypriot and their “optimized docker image for Raspberry Pi” but I personally tried to get it working reliably for a two days and went back to Jesse. No disrespect.
Creating an empty file called “ssh” before you put the card in the Raspberry Pi
SSH into the new Pi
I’m on Windows so I used WSL (Ubuntu) for Windows that lets me SSH and do run Linux natively.
ssh pi@raspberrypi
Login pi, password raspberry.
Change the Hostname
I ran
rasbpi-config
then immediately reboot with “sudo reboot”
Install Docker
curl -sSL get.docker.com | sh && \ sudo usermod pi -aG docker
Disable Swap. Important, you’ll get errors in Kuberenetes otherwise
sudo dphys-swapfile swapoff && \ sudo dphys-swapfile uninstall && \ sudo update-rc.d dphys-swapfile remove
Go edit /boot/cmdline.txt with your favorite editor, or use
sudo nano /boot/cmdline
and add this at the very end. Don’t press enter.
cgroup_enable=cpuset cgroup_enable=memory
Install Kubernetes
curl -s http://ift.tt/22fimui | sudo apt-key add - && \ echo "deb http://ift.tt/2f7PUy5 kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \ sudo apt-get update -q && \ sudo apt-get install -qy kubeadm
MASTER/BOSS NODE
After ssh’ing into my main node, I used /ifconfig eth0 to figure out what the IP adresss was. Ideally you want this to be static (not changing) or at least a static lease. I logged into my router and set it as a static lease, so my main node ended up being 192.168.170.2, and .1 is the router itself.
Then I initialized this main node
sudo kubeadm init --apiserver-advertise-address=192.168.170.2
This took a WHILE. Like 10-15 min, so be patient.
Kubernetes uses this admin.conf for a ton of stuff, so you’re going to want a copy in your $HOME folder so you can call “kubectl” easily later, copy it and take ownership.
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
When this is done, you’ll get a nice print out with a ton of info and a token you have to save. Save it all. I took a screenshot.
WORKER NODES
Ssh into your worker nodes and join them each to the main node. This line is the line you needed to have saved above when you did a kubectl init.
kubeadm join --token d758dc.059e9693bfa5 192.168.170.2:6443 --discovery-token-ca-cert-hash sha256:c66cb9deebfc58800a4afbedf0e70b93c086d02426f6175a716ee2f4d
Did it work?
While ssh’ed into the main node – or from any networked machine that has the admin.conf on it – try a few commands.
Here I’m trying “kubectl get nodes” and “kubectl get pods.”
Note that I already have some stuff installed, so you’ll want try “kubectl get pods –namespace kube-system” to see stuff running. If everything is “Running” then you can finish setting up networking. Kubernetes has fifty-eleven choices for networking and I’m not qualified to pick one. I tried Flannel and gave up and then tried Weave and it just worked. YMMV. Again, double check Alex’s Gist if this changes.
kubectl apply -f http://ift.tt/2qJxB6N
At this point you should be ready to run some code!
Hello World…with Markdown
Back to Alex’s gist, I’ll try this “markdownrender” app. It will take some Markdown and return HTML.
Go get the function.yml from here and create the new app on your new cluster.
$ kubectl create -f function.yml $ curl -4 http://localhost:31118 -d "# test" <p><h1>test</h1></p>
This part can be tricky – it was for me. You need to understand what you’re doing here. How do we know the ports? A few ways. First, it’s listed as nodePort in the function.yml that represents the desired state of the application.
We can also run “kubectl get svc” and see the ports for various services.
pi@hanselboss1:~ $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager NodePort 10.103.43.130 <none> 9093:31113/TCP 1d dotnet-ping ClusterIP 10.100.153.185 <none> 8080/TCP 1d faas-netesd NodePort 10.103.9.25 <none> 8080:31111/TCP 2d gateway NodePort 10.111.130.61 <none> 8080:31112/TCP 2d http-ping ClusterIP 10.102.150.8 <none> 8080/TCP 1d kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d markdownrender NodePort 10.104.121.82 <none> 8080:31118/TCP 1d nodeinfo ClusterIP 10.106.2.233 <none> 8080/TCP 1d prometheus NodePort 10.98.110.232 <none> 9090:31119/TCP 2d
See those ports that are outside:insider? You can get to markdownrender directly from 31118 on an internal IP like localhost, or the main/master IP. Those 10.x.x.x are all software networking, you can not worry about them. See?
pi@hanselboss1:~ $ curl -4 http://ift.tt/2zWjCfR -d "# test" <h1>test</h1> pi@hanselboss1:~ $ curl -4 http://ift.tt/2xuMdHf -d "# test" curl: (7) Failed to connect to 10.104.121.82 port 31118: Network is unreachable
Can we access this cluster from another machine? My Windows laptop, perhaps?
Access your Raspberry Pi Kubernetes Cluster from your Windows Machine (or elsewhere)
I put KubeCtl on my local Windows machine put it in the PATH.
I copied the admin.conf over from my Raspberry Pi. You will likely use scp or WinSCP.
I made a little local batch file like this. I may end up with multiple clusters and I want it easy to switch between them.
SET KUBECONFIG=”C:\users\scott\desktop\k8s for pi\admin.conf
Once you have Kubectl on another machine that isn’t your Pi, try running “kubectl proxy” and see if you can hit your cluster like this. Remember you’ll get weird “Connection refused” if kubectl thinks you’re talking to a local cluster.
Here you can get to localhost:8001/api and move around, then you’ve successfully punched a hole over to your cluster (proxied) and you can treat localhost:8001 as your cluster. So “kubectl proxy” made that possible.
If you have WSL (Windows Subsystem for Linux) – and you should – then you could also do this and TUNNEL to the API. But I’m going to get cert errors and generally get frustrated. However, tunneling like this to other apps from Windows or elsewhere IS super useful. What about the Kubernetes Dashboard?
~ $ sudo ssh -L 8001:10.96.0.1:443 [email protected]
I’m going to install the Kubernetes Dashboard like this:
kubectl apply -f http://ift.tt/2xudwS6
Pay close attention to that URL! There are several sites out there that may point to older URLs, non ARM dashboard, or use shortened URLs. Make sure you’re applying the ARM dashboard. I looked here http://ift.tt/2zWjCMT.
Notice I’m using the “alternative” dashboard. That’s for development and I’m saying I don’t care at all about security when accessing it. Be aware.
I can see where my Dashboard is running, the port and the IP address.
pi@hanselboss1:~ $ kubectl get svc --namespace kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 2d kubernetes-dashboard ClusterIP 10.98.2.15 <none> 80/TCP 2d
NOW I can punch a hole with that nice ssh tunnel…
~ $ sudo ssh -L 8080:10.98.2.15:80 [email protected]
I can access the Kubernetes Dashboard now from my Windows machine at http://localhost:8080 and hit Skip to login.
Do note the Namespace dropdown and think about what you’re viewing. There’s the kube-system stuff that manages the cluster
Adding OpenFaas and calling a serverless function
Let’s go to the next level. We’ll install OpenFaas – think Azure Functions or Amazon Lambda, except for your own Docker and Kubernetes cluster. To be clear, OpenFaas is an Application that we will run on Kubernetes, and it will make it easier to run other apps. Then we’ll run other stuff on it…just some simple apps like Hello World in Python and .NET Core. OpenFaas is one of several open source “Serverless” solutions.
Do you need to use OpenFaas? No. But if your goal is to write a DoIt() function and put it on your little cluster easily and scale it out, it’s pretty fabulous.
Remember my definition of Serverless…there ARE servers, you just don’t think about them.
Serverless Computing is like this – Your code, a slider bar, and your credit card.
Let’s go.
.NET Core on OpenFaas on Kubernetes on Raspberry Pi
I ssh’ed into my main/master cluster Pi and set up OpenFaas:
git clone http://ift.tt/2eHgAFS && cd faas-netes kubectl apply -f faas.armhf.yml,rbac.yml,monitoring.armhf.yml
Once OpenFaas is installed on your cluster, here’s Alex’s great instructions on how to setup your first OpenFaas Python function, so give that a try first and test it. Once we’ve installed that Python function, we can also hit http://ift.tt/2zWjFIz (where that’s your main Boss/Master’s IP) and see it the OpenFaas UI.
OpenFaas and the “faas-netes” we setup above automates the build and deployment of our apps as Docker Images to Kuberetes. It makes the “Developer’s Inner Loop” simpler. I’m going to make my .NET app, build, deploy, then change, build, deploy and I want it to “just work” on my cluster. And later, and I want it to scale.
I’m doing .NET Core, and since there is a runtime for .NET Core for Raspberry Pi (and ARM system) but no SDK, I need to do the build on my Windows machine and deploy from there.
Quick Aside: There are docker images for ARM/Raspberry PI for running .NET Core. However, you can’t build .NET Core apps (yet?) directly ON the ARM machine. You have to build them on an x86/x64 machine and then get them over to the ARM machine. That can be SCP/FTPing them, or it can be making a docker container and then pushing that new docker image up to a container registry, then telling Kubernetes about that image. K8s (cool abbv) will then bring that ARM image down and run it. The technical trick that Alex and I noticed was of course that since you’re building the Docker image on your x86/x64 machine, you can’t RUN any stuff on it. You can build the image but you can’t run stuff within it. It’s an unfortunate limitation for now until there’s a .NET Core SDK on ARM.
What’s required on my development machine (not my Raspberry Pis?
I installed KubeCtl (see above) in the PATH
I installed OpenFaas’s  Faas-CLI command line and put it in the PATH
I installed Docker for Windows. You’ll want to make sure your machine has some flavor of Docker if you have a Mac or Linux machine.
I ran docker login at least once.
I installed .NET Core from http://dot.net/core
Here’s the gist we came up with, again thanks Alex! I’m going to do it from Windows.
I’ll use the faas-cli to make a new function with charp. I’m calling mine dotnet-ping.
faas-cli new --lang csharp dotnet-ping
I’ll edit the FunctionHandler.cs to add a little more. I’d like to know the machine name so I can see the scaling happen when it does.
using System; using System.Text; namespace Function { public class FunctionHandler { public void Handle(string input) { Console.WriteLine("Hi your input was: "+ input + " on " + System.Environment.MachineName); } } }
Check out the .yml file for your new OpenFaas function. Note the gateway IP should be your main Pi, and the port is 31112 which is OpenFaas.
I also changed the image to include “shanselman/” which is my Docker Hub. You could also use a local Container Registry if you like.
provider: name: faas gateway: http://ift.tt/2xtjend functions: dotnet-ping: lang: csharp handler: ./dotnet-ping image: shanselman/dotnet-ping
Head over to the ./template/csharp/Dockerfile and we’re going to change it. Ordinarily it’s fine if you are publishing from x64 to x64 but since we are doing a little dance, we are going to build and publish the .NET apps as linux-arm from our x64 machine, THEN push it, we’ll use a multi stage docker file. Change the default Docker file to this:
FROM microsoft/dotnet:2.0-sdk as builder ENV DOTNET_CLI_TELEMETRY_OPTOUT 1 # Optimize for Docker builder caching by adding projects first. RUN mkdir -p /root/src/function WORKDIR /root/src/function COPY ./function/Function.csproj . WORKDIR /root/src/ COPY ./root.csproj . RUN dotnet restore ./root.csproj COPY . . RUN dotnet publish -c release -o published -r linux-arm ADD http://ift.tt/2zVAP98 /usr/bin/fwatchdog RUN chmod +x /usr/bin/fwatchdog FROM microsoft/dotnet:2.0.0-runtime-stretch-arm32v7 WORKDIR /root/ COPY --from=builder /root/src/published . COPY --from=builder /usr/bin/fwatchdog / ENV fprocess="dotnet ./root.dll" EXPOSE 8080 CMD ["/fwatchdog"]
Notice a few things. All the RUN commands are above the second FROM where we take the results of the first container and use its output to build the second ARM-based one. We can’t RUN stuff because we aren’t on ARM, right?
We use the Faas-Cli to build the app, build the docker container, AND publish the result to Kubernetes.
faas-cli build -f dotnet-ping.yml --parallel=1 faas-cli push -f dotnet-ping.yml faas-cli deploy -f dotnet-ping.yml --gateway http://ift.tt/2xtjend
And here is the dotnet-ping command running on the pi, as seen within the Kubernetes Dashboard.
I can then scale them out like this:
kubectl scale deploy/dotnet-ping --replicas=6
And if I hit it multiple times – either via curl or via the dashboard, I see it’s hitting different pods:
If I want to get super fancy, I can install Grafana – a dashboard manager by running locally in my machine on port 3000
docker run -p 3000:3000 -d grafana/grafana
Then I can add OpenFaas a datasource by pointing Grafana to http://ift.tt/2zVaKqu which is where the Prometheus metrics app is already running, then import the OpenFaas dashboard from the grafana.json file that is in the I cloned it from.
Super cool. I’m going to keep using this little Raspberry Pi Kubernetes Cluster to learn as I get ready to do real K8s in Azure! Thanks to Alex Ellis for his kindness and patience and to Jessie Frazelle for making me love both Windows AND Linux!
* If you like this blog, please do use my Amazon links as they help pay for projects like this! They don’t make me rich, but a few dollars here and there can pay for Raspberry Pis!
Sponsor: Check out JetBrains Rider: a new cross-platform .NET IDE. Edit, refactor, test and debug ASP.NET, .NET Framework, .NET Core, Xamarin or Unity applications. Learn more and download a 30-day trial!
© 2017 Scott Hanselman. All rights reserved.
      How to Build a Kubernetes Cluster with ARM Raspberry Pi then run .NET Core on OpenFaas syndicated from http://ift.tt/2wBRU5Z
0 notes